Powershell在脚本

时间:2016-07-13 19:53:54

标签: powershell variables instance-variables

晚上好

我对此版本有这个问题

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

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

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

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

    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可以帮我解决这个问题吗?

    非常感谢您的帮助!!

    亲切的问候, 汤姆

1 个答案:

答案 0 :(得分:0)

我已经向脚本专家提出这个问题' Forum也是。

我有两个很好的答案:

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

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

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

    亲切的问候,汤姆