Where-Object:无法绑定参数“FilterScript”

ky *_*bof 3 powershell powercli

我有一个问题有两个问题。我有以下 powercli cmd:

$snapLst = Get-VM vmindev |Get-Snapshot |Select VM, Name, Description, `
 @{Name='Created'; Expression={{$_.Created.ToString("yyMMdd")}}, `
 @{Name='SizeMB'; Expression={[int] $_.SizeMB}}
$resultLst=$snapLst| where SizeMB -gt 1000 |Sort-Object SizeMB |`
 Select @{Name='Type'; Expression={'BIG'}},*
Run Code Online (Sandbox Code Playgroud)

当在我的 DEV 环境(连接到 vSphere 服务器的桌面上的 powercli 会话)中运行时,一切都很好。在生产环境中运行时(即 vSphere 服务器上的 powercli 会话),我收到以下错误:

Where-Object : Cannot bind parameter 'FilterScript'. Cannot convert the "SizeMB" value of type "System.String" to type System.Management.Automation.ScriptBlock".
    At C:\Users\kness\Scripts\sn2.ps1:32 char:27
    + $resultLst=$snapLst| where <<<<  SizeMB -gt 1000 |Sort-Object SizeMB |Select
    @{Name='Type'; Expression={'BIG'}},
        + CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.WhereObjectCommand
Run Code Online (Sandbox Code Playgroud)

问题 1:在环境设置中,什么会使脚本的行为有所不同?我检查了 powercli 的版本...它们完全相同。

Q2:由于上述错误,我通过运行以下命令查看列表的属性:

$snapLst = Get-VM vmindev |Get-Snapshot |Get-Member |Findstr Size
SizeGB            Property   System.Nullable`1[[System.Decimal, mscorlib, Ve...
SizeMB            Property   System.Decimal SizeMB {get;}
Run Code Online (Sandbox Code Playgroud)

SizeMB 是“十进制”类型;为什么错误抱怨它是一个“字符串”?

提前谢谢!

ky *_*bof 5

我在 TesselttingHeckler 的帮助下解决了这个问题。

A1。尽管我的 PowerCLI 包是相同的,但它在两个不同的 Powershell 安装上运行。在我的桌面上,PSVersion 是 4.0,在生产服务器上,它是 2.0

A2。这与A1有关。在 PS 4.0 中,cmdlet where被正确转换为Where-Object {...}。而在 PS 2.0 中,这是一个语法错误。关于SizeMBSystem.String的抱怨只是“where”语法错误之后的一个转移注意力的事情。

通过将where SizeMB -gt 1000更改为Where-Object {$_.SizeMB -gt 1000},脚本现在可以正常工作。我想,替代方案是升级 vSphere 服务器上的 PS...但我不想这样做。感谢您对大家的帮助。