我有一个问题,有两个问题。我有以下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 ...但是我不想去那里。感谢您对大家的帮助。