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 是“十进制”类型;为什么错误抱怨它是一个“字符串”?
提前谢谢!
我在 TesselttingHeckler 的帮助下解决了这个问题。
A1。尽管我的 PowerCLI 包是相同的,但它在两个不同的 Powershell 安装上运行。在我的桌面上,PSVersion 是 4.0,在生产服务器上,它是 2.0
A2。这与A1有关。在 PS 4.0 中,cmdlet where被正确转换为Where-Object {...}。而在 PS 2.0 中,这是一个语法错误。关于SizeMB是System.String的抱怨只是“where”语法错误之后的一个转移注意力的事情。
通过将where SizeMB -gt 1000更改为Where-Object {$_.SizeMB -gt 1000},脚本现在可以正常工作。我想,替代方案是升级 vSphere 服务器上的 PS...但我不想这样做。感谢您对大家的帮助。
| 归档时间: |
|
| 查看次数: |
5013 次 |
| 最近记录: |