我试图计算命令输出的一些行。在此示例中,基本上所有以“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命令正在运行OK
那么,为什么它在脚本中失败,却可以在命令行上运行?

最佳答案

使用@()运算符强制输出始终为数组:

$BeforeCount = @($ItsAgents | Select-String ' Y ').Count



注意:Afaik它的工作方式应与脚本和控制台相同。也许您的命令产生了不同的输出,其中控制台版本返回2个以上的结果,但是由于某种原因,脚本版本仅返回1个或0个结果,这就是没有Count属性的原因。

08-28 13:12