Я все еще новичок в PowerShell и его практических реализациях ... но я создал сценарий для мониторинга состояния диска и получил очень странные результаты в 2012 R2. Интересно, видел ли кто-нибудь подобное и / или есть решение… Или это ошибка?
Рассматриваемый сценарий:
$OutputFile=$env:temp + "\~VMRepl-Status.txt"
get-vmreplication | Out-File -FilePath $OutputFile
measure-vmreplication | Out-File -FilePath $OutputFile -Append
Get-PhysicalDisk | Sort Size | FT FriendlyName, Size, MediaType, Manufacturer, Model, HealthStatus, OperationalStatus -AutoSize | Out-File -FilePath $OutputFile -Append
Get-PhysicalDisk | Get-StorageReliabilityCounter | ft deviceid, temperature, wear -AutoSize | Out-File -FilePath $OutputFile -Append
$body=(Get-Content $OutputFile | out-string)
Send-MailMessage -To [removed] -From [removed] -body $body -SmtpServer 10.24.42.45 -subject "Hyper-V Replica and Disk Disk Status"
Я выполняю приведенный выше сценарий PowerShell, используя двухстрочный командный файл:
@echo off Powershell.exe -executionpolicy remotesigned -File c:\Windows\scripts\DailyReplicaStatusUpdate.ps1
Если я выполню сценарий PowerShell из командной строки или щелкнув правой кнопкой мыши и запустив его от имени администратора, я получу:
FriendlyName Size MediaType Manufacturer Model HealthStatus OperationalStatus ------------ ---- --------- ------------ ----- ------------ ----------------- PhysicalDisk15 119185342464 SSD INTEL SS DSC2BW120A4 Healthy OK PhysicalDisk3 119185342464 SSD INTEL SSDSC2BW120A4 Healthy OK PhysicalDisk0 1000203804160 UnSpecified SAMSUNG HD103SI Healthy OK PhysicalDisk9 1499480457216 UnSpecified ST315003 41AS Healthy OK PhysicalDisk14 1499480457216 UnSpecified ST315003 41AS Healthy OK PhysicalDisk2 1999575711744 HDD TOSHIBA DT01ACA200 Healthy OK PhysicalDisk1 1999575711744 HDD ST2000DL003-9VT166 Healthy OK PhysicalDisk6 1999575711744 HDD WDC WD20 EARS-00MVWB0 Healthy OK PhysicalDisk4 1999575711744 HDD ST2000DL 003-9VT166 Healthy OK PhysicalDisk11 1999575711744 UnSpecified ST320005 42AS Healthy OK PhysicalDisk21 2000398934016 UnSpecified Seagate Desktop Healthy OK PhysicalDisk10 2999766220800 UnSpecified WDC WD30 EZRX-00DC0B0 Healthy OK PhysicalDisk5 2999766220800 UnSpecified TOSHIBA DT01ACA300 Healthy OK PhysicalDisk7 2999766220800 UnSpecified TOSHIBA DT01ACA300 Healthy OK PhysicalDisk12 2999766220800 HDD ST3000DM 001-1CH166 Healthy OK PhysicalDisk13 2999766220800 HDD ST3000DM 001-1CH166 Healthy OK PhysicalDisk8 2999766220800 HDD ST3000DM 001-9YN166 Healthy OK PhysicalDisk22 3000592977920 UnSpecified Seagate Expansion Desk Healthy OK
Но если я инициирую его из запланированной задачи, я получаю:
FriendlyName Size MediaType Manufacturer Model Healt hStat us ------------ ---- --------- ------------ ----- ----- PhysicalDisk15 119185342464 SSD INTEL SS DSC2BW120A4 He... PhysicalDisk3 119185342464 SSD INTEL SSDSC2BW120A4 He... PhysicalDisk0 1000203804160 UnSpecified SAMSUNG HD103SI He... PhysicalDisk9 1499480457216 UnSpecified ST315003 41AS He... PhysicalDisk14 1499480457216 UnSpecified ST315003 41AS He... PhysicalDisk2 1999575711744 HDD TOSHIBA DT01ACA200 He... PhysicalDisk1 1999575711744 HDD ST2000DL003-9VT166 He... PhysicalDisk6 1999575711744 HDD WDC WD20 EARS-00MVWB0 He... PhysicalDisk4 1999575711744 HDD ST2000DL 003-9VT166 He... PhysicalDisk11 1999575711744 UnSpecified ST320005 42AS He... PhysicalDisk21 2000398934016 UnSpecified Seagate Desktop He... PhysicalDisk10 2999766220800 UnSpecified WDC WD30 EZRX-00DC0B0 He... PhysicalDisk5 2999766220800 UnSpecified TOSHIBA DT01ACA300 He... PhysicalDisk7 2999766220800 UnSpecified TOSHIBA DT01ACA300 He... PhysicalDisk12 2999766220800 HDD ST3000DM 001-1CH166 He... PhysicalDisk13 2999766220800 HDD ST3000DM 001-1CH166 He... PhysicalDisk8 2999766220800 HDD ST3000DM 001-9YN166 He... PhysicalDisk22 3000592977920 UnSpecified Seagate Expansion Desk He...
Я хотел бы знать, как заставить его прекратить обрезать строки и позволить мне получить фактическое состояние здоровья - полный текст - без потери какой-либо другой информации по пути (я МОЖЕТ уменьшить размер или что-то еще и сократить длину каждой строки ).
В конце концов, цель состоит в том, чтобы получить результат, который я получаю от его запуска в командной строке, а не результат, который я получаю, когда он запускается через планировщик заданий.
Хорошо, ваша проблема в использовании Out-String
командлет. По умолчанию он имеет значение 80, хотя вы можете изменить его, указав другую ширину с помощью параметра -Width
переключатель. Похоже, у вас больше 25 символов, поэтому вы сможете исправить это, изменив строку 6 на:
$ body = (Get-Content $ OutputFile | out-string -Width 105)
Окно консоли имеет другую ширину при запуске из запланированной задачи (если бы вы могли видеть окно, оно было бы больше похоже на стандартную черную командную строку, чем на синее окно Powershell, которое вы привыкли видеть).
Это важно, потому что вы используете ft
(Format-Table
), который обычно используется только для вывода на экран.
Вы можете изменить размер окна консоли, используя $host.Console.RawUI
и его свойства, но я не рекомендую использовать Format-
хотя в данном случае это может быть проще. Также это не будет работать в ISE.
Вместо этого отформатируйте строки для сообщения электронной почты самостоятельно.