通过管道(|)在powershell中传递“字符串”变量不起作用

时间:2011-11-14 23:24:50

标签: powershell

不能用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 个答案:

答案 0 :(得分:5)

$fc_volumes似乎不包含字符串,而是包含具有“volume”属性的一组对象。您可以使用Select-Object cmdlet在管道上展开此属性,只为您提供字符串:

$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" }

答案 1 :(得分:2)

除了zdan的答案之外,我还想指出你应该只在管道的最后使用format- * cmdlet,因为它们是为了输出到控制台。迭代format- *结果是没有用的。你得到的那些Microsoft.PowerShell.Commands.Internal.Format.* - 它们是带有附加格式信息的包装字符串,你不需要它们。重构你的代码,这样你只能在显示给用户的任何内容上调用Format- *,如果你传递一些结果用于进一步处理(比如获得性能计数器),这应该在之前完成格式 - *