【问题标题】:Powershell is reanimating variables in ScriptsPowershell 正在恢复脚本中的变量
【发布时间】:2016-11-16 13:34:54
【问题描述】:

晚上好

这个版本有这个问题

PS C:\temp> $PSVersionTable.PSVersion.Major
4

这是一个非常奇怪的问题...... 尽管有初始化变量,PowerShell 脚本还是能够以某种方式重用以前调用中的变量值。

脚本很简单;为了显示问题,我使用了一个虚拟机列表:

  1. 将所有虚拟机读入一个数组
  2. 选择数组中的第一个元素
  3. 从第 2 步向对象添加新属性
  4. 问题:如果我第二次运行脚本,新属性已经存在 - 尽管所有变量都已初始化。如果我在新会话中启动脚本,则新属性在第一次运行时会丢失,之后它就已经存在了。

这是简单的代码:

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
…

有人可以帮我解决这个问题吗?

非常感谢您的帮助!

亲切的问候, 汤姆

【问题讨论】:

  • 这个命令返回给你什么:[Object]::ReferenceEquals((Get-VM|Select-Object -First 1),(Get-VM|Select-Object -First 1))?

标签: powershell variables instance-variables


【解决方案1】:

我也向“脚本专家”Forum 提出了这个问题。

我有两个很好的答案:

  1. 来自 jrv:
    您没有退出 PowerShell。 VM 对象对于会话是动态的。它会一直存在,直到您关闭 PowerShell。有些物体是这样的。代码库将它们拖到 PowerShell 并保持缓存。我怀疑这就是这里发生的事情。

  2. 来自 Evgenij Smirnov:
    你好,
    这似乎特定于 VM 对象。如果我用 Get-Process 或 Get-ChildItem c:\ 替换 Get-VM,我不会遇到这种行为。如果我每次运行脚本时都选择一个新 VM,它不会保留该属性。另一方面,如果在运行脚本四次后执行 (Get-VM)[0].MyList,我会得到四个条目。
    因此,这种持久性显然内置在 Hyper-V 模块中,自定义属性被添加到 VM 对象本身的实例中。因此,您可以像这样在整个 VM 集合上初始化 MyTest 为空:

$AllVMs | foreach {
  if ($_.PSobject.Properties.Name -match "MyList") {
    $_.MyList = @()
  }     
} 

亲切的问候,汤姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2014-08-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多