Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell正在重新激活脚本中的变量_Powershell_Variables_Instance Variables - Fatal编程技术网

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脚本还是能够以某种方式重用以前调用的变量值

剧本简单;为了说明问题,我使用了一个虚拟机列表:

  • 将所有虚拟机读取到阵列中
  • 选择数组中的第一个元素
  • 从步骤2中向对象添加新属性
  • 问题是:如果我再次运行脚本,新属性已经存在了——尽管所有变量都已初始化。如果在新会话中启动脚本,则新属性在第一次运行时丢失,之后它已经存在
  • 下面是简单的代码:

    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
    …
    
    有人能帮我解决这个问题吗

    非常感谢你的帮助

    亲切问候,,
    汤姆

    我也向“脚本编写人”提出了这个问题

    我有两个很好的答案:

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

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


  • 你好,汤姆,我也向“脚本编写人”问了这个问题

    我有两个很好的答案:

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

  • 来自Evgenij Smirnov:
    嗨,
    这似乎是特定于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 = @()
      }     
    }