Передача «строковой» переменной в powershell через pipe (|) не работает - PullRequest
1 голос
/ 15 ноября 2011

Не могу думать иначе, кроме как с ksh / perl, поэтому powershell раздражает.

Попытка обработать список имен и выполнить команду, в которой переменная объединяется / объединяется с другой строкой.

Ввод:

PS C:\WINDOWS\SysWOW64\windowspowershell\v1.0> $fc_volumes | select-object -first 10

    volume
    ------ 
    dnvlxd531_archives 
    dnvux100_quorum 
    oraapps_quorum 
    dnv05_lun04 
    sdw_cl_dnv05_lun11_0 
    FCP_vol132 
    dnv05_lun37 
    dnv05_lun36

Попытка команды и вывода:

PS C:\WINDOWS\SysWOW64\windowspowershell\v1.0> $fc_volumes | foreach-object { $_ } {dfm perf data retrieve -o dnvnaf005:/$_ -C volume:total_ops -V "Volume IOPs View" }
Error: Failed to get counter data
        Reason: There is no object named 'dnvnaf005:/Microsoft.PowerShell.Commands.Internal.Format.FormatStartData'.
Error: Failed to get counter data
        Reason: There is no object named 'dnvnaf005:/Microsoft.PowerShell.Commands.Internal.Format.GroupStartData'.
Error: Failed to get counter data
        Reason: There is no object named 'dnvnaf005:/Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData'.
Error: Failed to get counter data
        Reason: There is no object named 'dnvnaf005:/Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData'.
Error: Failed to get counter data

Парсер явно видит отформатированный поток, но я не могу понять, какчтобы он использовал только значение, а не все форматирование.

Спасибо,

Майк

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

$fc_volumes, кажется, не содержит строк, но представляет собой группу объектов со свойством громкости. Вы можете использовать командлет Select-Object, чтобы развернуть это свойство в конвейере и получить только строки:

$fc_volumes | select-object -ExpandProperty "volume" | foreach-object {dfm perf data retrieve -o dnvnaf005:/$_ -C volume:total_ops -V "Volume IOPs View" }

или вы можете просто сделать это встроенным в цикле foreach, обратившись непосредственно к свойству:

$fc_volumes | foreach-object {dfm perf data retrieve -o dnvnaf005:/$_.volume -C volume:total_ops -V "Volume IOPs View" }
2 голосов
/ 16 ноября 2011

В дополнение к ответу zdan, который точен, я хотел бы отметить, что вы должны использовать только командлеты format- * в самом конце конвейера, так как они предназначены для форматирования вывода на консоль. Нет смысла перебирать результаты в формате- *. Те Microsoft.PowerShell.Commands.Internal.Format.*, которые вы получаете - это обернутые строки с прикрепленной к ним информацией о формате, они вам не нужны. Выполните рефакторинг кода, чтобы вызывать Format- * только для того, что отображается пользователю, и если вы передаете некоторые результаты для дальнейшей обработки (например, для получения счетчиков производительности), это должно быть сделано за до - они были отформатированы с Format - *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...