chand1er
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору [more] [more] при выполнении $cli= C:\Raid\rstcli64.exe -I -d 0-0-0-0 > C:\Raid\pdisk0.txt PS ругается на Код: rstcli64.exe : строка:1 знак:27 + $cli= C:\Raid\rstcli64.exe <<<< -I -d 0-0-0-0 > C:\Raid\pdisk0.txt + CategoryInfo : NotSpecified: (:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 0 | Пробовал по разному экранировать кавычками - результата пока не добился при выполнении моего скрипта Код: $cli= C:\Raid\rstcli64.exe -I -d 0-0-0-0 > C:\Raid\pdisk0.txt $a = get-content C:\Raid\pdisk0.txt | select-string "State" if ($a -match "State: Normal") { $b = "1" } if ($a -notmatch "State: Normal") { $b = "Down" } write-host $b Результат: PS C:\Windows\system32> C:\RAID\pdisk0.ps1 rstcli64.exe : C:\RAID\pdisk0.ps1:1 знак:27 + $cli= C:\Raid\rstcli64.exe <<<< -I -d 0-0-0-0 > C:\Raid\pdisk0.txt + CategoryInfo : NotSpecified: (:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 0 1 | То есть единицу он возвращает как состояние, но при этом еще приписывает 0, насколько я понял - из-за неправильного оформления + $cli= C:\Raid\rstcli64.exe <<<< -I -d 0-0-0-0 Если выполнить ваш скрипт и подставить вместо фиксированного текста ссылку на C:\Raid\rstcli64.exe, Код: $str = C:\Raid\rstcli64.exe -I -d 0-0-0-0 > C:\Raid\pdisk0.txt $hshIniContents = @{} $str -split "\n" | %{ switch -regex ($_) { "ID:[^\d]*((\d*-?){4}).*" {$strID = $Matches[1]; if ($strID) {$hshIniContents[$strID] = @{}};break} "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strID][$strKey] = $strValue} else {$hshIniContents[$strKey] = $strValue}} } } $hshIniContents["0-1-0-0"]["State"] #значение State для опредленного ID $hshIniContents["Num Disks"] #значение из --VOLUME INFORMATION-- $hshIniContents["State"] #значение из --VOLUME INFORMATION-- | то получается Код: PS C:\Windows\system32> C:\RAID\test2.ps1 rstcli64.exe : C:\RAID\test2.ps1:1 знак:28 + $str = C:\Raid\rstcli64.exe <<<< -I -d 0-0-0-0 > C:\Raid\pdisk0.txt + CategoryInfo : NotSpecified: (:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 0 Не удается индексировать в массив NULL. C:\RAID\test2.ps1:12 знак:28 + $hshIniContents["0-1-0-0"][ <<<< "State"] #значение State для опредленного ID + CategoryInfo : InvalidOperation: (State:String) [], RuntimeExcepti on + FullyQualifiedErrorId : NullArray | Если выполнить ваш оригинальный скрипт из powershell ise, то: Код: $str = '--VOLUME INFORMATION-- Num Disks: 2 State: Normal --END DEVICE INFORMATION-- ID: 0-0-0-0 State: Normal Model: WDC WD5003ABYX-01WERA0 ID: 0-1-0-0 State: Normal Model: WDC WD5003ABYX-01WERA0' $hshIniContents = @{} $str -split "\n" | %{ switch -regex ($_) { "ID:[^\d]*((\d*-?){4}).*" {$strID = $Matches[1]; if ($strID) {$hshIniContents[$strID] = @{}};break} "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strID][$strKey] = $strValue} else {$hshIniContents[$strKey] = $strValue}} } } $hshIniContents["0-1-0-0"]["State"] #значение State для опредленного ID $hshIniContents["Num Disks"] #значение из --VOLUME INFORMATION-- $hshIniContents["State"] #значение из --VOLUME INFORMATION-- | то результат Код: PS C:\Windows\system32> C:\RAID\test2.ps1 Не удается индексировать в массив NULL. C:\RAID\test2.ps1:18 знак:119 + "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strID][ <<<< $strKey] = $strValue} + CategoryInfo : InvalidOperation: (Num Disks:String) [], RuntimeExc eption + FullyQualifiedErrorId : NullArray Не удается индексировать в массив NULL. C:\RAID\test2.ps1:18 знак:119 + "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strID][ <<<< $strKey] = $strValue} + CategoryInfo : InvalidOperation: (State:String) [], RuntimeExcepti on + FullyQualifiedErrorId : NullArray Normal | Если запускать ваш оригинальный скрипт из командной строки PS - то все нормально: Код: PS C:\raid> .\test2.ps1 Normal 2 Normal | текстовый файл получаемый из $cli= C:\Raid\rstcli64.exe -I -d 0-0-0-0 > C:\Raid\pdisk0.txt имеет вид Код: --DISK INFORMATION-- ID: 0-0-0-0 Type: Disk Disk Type: SATA Disk State: Normal Size: 466 GB Free Size: 0 GB System Disk: False Usage: Array member Serial Number: WD-WMAYP2205159 Model: WDC WD5003ABYX-01WERA0 | Смущает то что PS ругается на команду C:\Raid\rstcli64.exe и выводит 0, сейчас пробую различные варианты кавычек и скобок. | Всего записей: 4 | Зарегистр. 13-12-2013 | Отправлено: 08:42 17-12-2013 | Исправлено: chand1er, 09:29 17-12-2013 |
|