我正在尝试计算命令输出的一些行。在此示例中,基本上所有以“ Y”结尾的行。
拳头捕获命令结果:
PS> $ItsAgents = tacmd listSystems -n Primary:SomeHost:NT PS> $ItsAgents Managed System Name Product Code Version Status Primary:SomeHost:NT NT 06.30.07.00 Y SomeHost:Q7 Q7 06.30.01.00 N
现在计算在线人数:
PS> $AgentCount = ($ItsAgents | Select-String ' Y ').Count PS> $AgentCount 1
现在一切正常。所以我将其放在脚本中,如下所示:
$ItsAgents = tacmd listSystems -n $agent
Write-Host $ItsAgents
$BeforeCount = ($ItsAgents | Select-String ' Y ').Count
当脚本运行时(在Set-StrictMode
下),我得到:
The property 'Count' cannot be found on this object. Verify that the property exists. At Y:\Scripts\newMoveAgents.ps1:303 char:7 + $BeforeCount = ($ItsAgents | Select-String ' Y ').Count + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], PropertyNotFoundException + FullyQualifiedErrorId : PropertyNotFoundStrict
Write-Host
确实输出了合理的结果,因此$agent
的设置正确,并且tacmd
命令正在运行
那么,为什么它在脚本中失败,却可以在命令行上运行?
答案 0 :(得分:1)
使用@()
运算符强制输出始终为数组:
$BeforeCount = @($ItsAgents | Select-String ' Y ').Count
数组子表达式运算符会创建一个数组,即使它 包含零个或一个对象。 (Microsoft Docs)
注意:Afaik它的工作方式应与脚本和控制台相同。也许您的命令产生了不同的输出,其中控制台版本返回2个以上的结果,但是由于某种原因,脚本版本仅返回1个或0个结果,这就是没有Count
属性的原因。 >