晚上好
我对此版本有这个问题
PS C:\temp> $PSVersionTable.PSVersion.Major
4
这是一个非常奇怪的问题...... 尽管已经初始化了变量,但PowerShell脚本能够以某种方式重用以前调用的变量值。
脚本很简单;为了显示问题,我使用虚拟机列表:
这是简单的代码:
Set-StrictMode -Version 2.0
# Read all Virtual Machines into an Array
$AllVMs = @()
$AllVMs = Get-VM
# Get the 1st Virtual Machine
$VM = $null
$VM = $AllVMs[0]
# Prepare my Property
$MyList = @()
$MyList += "Test"
# If the Property already exists, just add my List
if ($VM.PSobject.Properties.Name -match "MyList") {
$VM.MyList += $MyList
} else {
# My Property does not exist: create it
$VM | Add-Member –MemberType NoteProperty –Name MyList –Value ($MyList)
}
# Give Back my VM Object
$VM
要测试脚本,我只计算MyList-Elements的数量:
PS C:\temp> $result = c:\temp\testvar.ps1
PS C:\temp> $result.MyList.Count
1
PS C:\temp> $result = c:\temp\testvar.ps1
PS C:\temp> $result.MyList.Count
2
…
somone可以帮我解决这个问题吗?
非常感谢您的帮助!!
亲切的问候, 汤姆
答案 0 :(得分:0)
我已经向脚本专家提出这个问题' Forum也是。
我有两个很好的答案:
来自jrv:
您没有退出PowerShell。 VM对象对会话是动态的。它会一直存在,直到您关闭PowerShell。有些对象是这样的。代码库将它们拖到PowerShell,它们仍然被缓存。我怀疑这就是这里发生的事情。
来自Evgenij Smirnov:
嗨,
这似乎是VM对象特有的。如果我用Get-Process或Get-ChildItem替换Get-VM c:\我没有遇到这种行为。如果我每次运行脚本时选择一个新VM,它都不会保留该属性。另一方面,如果我在运行脚本四次后执行(Get-VM)[0] .MyList,我会得到四个条目。
因此,这种持久性显然构建在Hyper-V模块中,自定义属性被添加到VM对象本身的实例中。因此,您可以将MyTest初始化为整个VM集合,如下所示:
$AllVMs | foreach {
if ($_.PSobject.Properties.Name -match "MyList") {
$_.MyList = @()
}
}
亲切的问候,汤姆