我有一个问题,有两个问题。我有以下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'}},*

在我的DEV env(连接到vSphere服务器的台式机上的powercli session )中运行时,一切都很好。在PRODUCTION中运行(即vSphere服务器上的powercli session )时,出现以下错误:
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

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

Q2:因为上面的错误,我通过运行此cmd来查看列表的属性:
$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;}

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

提前谢谢!

最佳答案

我通过TessellatingHeckler的帮助解决了它。
A1。尽管我的PowerCLI软件包是相同的,但它可以在两种不同的Powershell安装上运行。在我的桌面上,PSVersion为4.0,在生产服务器上为2.0
A2。这与A1有关。在PS 4.0中,cmdlet位置已正确转换为Where-Object {...}。在PS 2.0中,这是语法错误。关于 SizeMB 是System.String的抱怨只是在“where”语法错误之后出现的一个红色鲱鱼。
通过将SizeMB -gt 1000的位置更改为Where-Object {$ _。SizeMB -gt 1000},脚本现在可以工作了。我想,替代方案是在vSphere服务器上升级PS ...但是我不想去那里。感谢您对大家的帮助。

08-26 23:37