我有一个问题,有两个问题。我有以下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环境中运行(桌面上的powercli会话连接到vSphere服务器),一切都很好。在PRODUCTION中运行时(即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
Q1:什么 - 在环境设置中 - 会使脚本的行为有所不同?我检查了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是&#34;十进制&#34;类型;为什么错误会抱怨它是&#34;字符串&#34;?
提前谢谢!答案 0 :(得分:3)
我通过帮助fr TessellatingHeckler解决了这个问题。
A1。虽然我的PowerCLI包是相同的,但它在两个不同的Powershell安装上运行。在我的桌面上,PSVersion是4.0,在生产服务器上,它是2.0
A2。这与A1有关。在PS 4.0中,cmdlet 将正确转换为 Where-Object {...} 。而在PS 2.0中,这是一个语法错误。抱怨 SizeMB 是 System.String 只是一个红色的鲱鱼跟随&#34;其中&#34;语法错误。
通过将其中SizeMB -gt 1000 更改为 Where-Object {$ _。SizeMB -gt 1000} ,脚本现在正在运行。我想,替代方案是升级vSphere服务器上的PS ......但我不想去那里。谢谢你的帮助。