不能用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
解析器显然看到了格式化的流,但我似乎无法弄清楚如何使用它只使用值,而不是所有格式化。
谢谢,
麦克
答案 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- *,如果你传递一些结果用于进一步处理(比如获得性能计数器),这应该在之前完成格式 - *