Powershell正在重新激活脚本中的变量
晚上好 我有这个版本的问题Powershell正在重新激活脚本中的变量,powershell,variables,instance-variables,Powershell,Variables,Instance Variables,晚上好 我有这个版本的问题 PS C:\temp> $PSVersionTable.PSVersion.Major 4 这是一个非常奇怪的问题。。。 尽管有初始化的变量,PowerShell脚本还是能够以某种方式重用以前调用的变量值 剧本简单;为了说明问题,我使用了一个虚拟机列表: 将所有虚拟机读取到阵列中 选择数组中的第一个元素 从步骤2中向对象添加新属性 问题是:如果我再次运行脚本,新属性已经存在了——尽管所有变量都已初始化。如果在新会话中启动脚本,则新属性在第一次运行时丢失,之后它
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元素的数量:
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
…
有人能帮我解决这个问题吗
非常感谢你的帮助
亲切问候,,
汤姆我也向“脚本编写人”提出了这个问题 我有两个很好的答案:
您没有从PowerShell退出。VM对象对会话是动态的。它会一直存在,直到您关闭PowerShell。有些物体是这样的。代码库将它们拖到PowerShell中,并保持缓存状态。我怀疑这就是这里发生的事情
嗨,
这似乎是特定于VM对象的。如果我用Get Process或Get ChildItem c:\替换Get VM,我不会经历这种行为。如果每次运行脚本时都选择一个新VM,则它不会保留该属性。另一方面,如果我执行(Get VM)[0]。在运行脚本四次后,我将得到四个条目。
因此,这种持久性显然内置于Hyper-V模块中,自定义属性被添加到VM对象本身的实例中。因此,您可以将整个VM集合上的MyTest初始化为空,如下所示:
你好,汤姆,我也向“脚本编写人”问了这个问题 我有两个很好的答案:
您没有从PowerShell退出。VM对象对会话是动态的。它会一直存在,直到您关闭PowerShell。有些物体是这样的。代码库将它们拖到PowerShell中,并保持缓存状态。我怀疑这就是这里发生的事情
嗨,
这似乎是特定于VM对象的。如果我用Get Process或Get ChildItem c:\替换Get VM,我不会经历这种行为。如果每次运行脚本时都选择一个新VM,则它不会保留该属性。另一方面,如果我执行(Get VM)[0]。在运行脚本四次后,我将得到四个条目。
因此,这种持久性显然内置于Hyper-V模块中,自定义属性被添加到VM对象本身的实例中。因此,您可以将整个VM集合上的MyTest初始化为空,如下所示:
亲切问候,汤姆这个命令返回给你的是什么:
[Object]::ReferenceEquals((Get-VM | Select Object-First 1)、(Get-VM | Select Object-First 1))
?这个命令返回给你的是什么:[Object]::ReferenceEquals((Get-VM | Select Object-First 1)、(Get-VM | Select Object-First 1))
?
$AllVMs | foreach {
if ($_.PSobject.Properties.Name -match "MyList") {
$_.MyList = @()
}
}