在多个变量中解析多个valus

时间:2017-03-09 20:29:17

标签: powershell

我正在尝试找到一种在powershell中执行命令的方法,并将结果的每一行放在另一个变量中,以便稍后在我的脚本中使用它们。例如,如果我执行以下命令:

C:\> Get-VMHost -Name hq-esxi-prod-01a.nsx.gss | Get-VM | select Name

我会得到以下内容:

Name          
----          
HQ-LinServ-01a
HQ-Win2012-01a
HQ-Web-02a 

我想要一个脚本,将每个行添加到脚本中的不同变量中(不包括第一行名称)。

我该怎么做。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以在循环中使用Set-Variable将每个值放在一个单独的变量中:

$i = 0
... | Get-Vm | Select-Objet -Expand Name | ForEach-Object {
  Set-Variable -Name "vm$i" -Value $_
  $i++
}

然而,这通常不是好建议。将所有名称放在一个(数组)变量中更为常见:

$vmList = ...| Get-Vm | Select-Object -Expand Name

因此您可以通过$vmList[<index>]访问个人姓名,或者(如果您需要通过某种名称访问)在哈希表中访问:

$i = 0
$vmList = @{}
... | Get-Vm | Select-Objet -Expand Name | ForEach-Object {
  $vmList["vm$i"] = $_
  $i++
}

但最佳做法取决于您需要的特定情况。

答案 1 :(得分:0)

感谢您的回复, 我试过你的回答,但似乎我在使用PowerCLI for VMware它不包括Select-Object -Expand(不确定我有例外),但是你的回答让我很难找到合适的答案。

我使用了下面的内容,使用foreach并在数组中添加值然后按如下所示读取它们工作正常:

$p1vmname = Get-VMHost -Name hq-esxi-prod-01a.nsx.gss | Get-VM | select Name
$p1vmlist = @()
foreach ($p1line in $p1vmname)
            {
            $p1vmlist += $p1line
            }
                $p1 = 0
                do {
                $x = $p1+1
                Write-Host -BackgroundColor:Black -ForegroundColor:Yellow "vm number $x is "$p1vmlist[$p1]"."
                $p1++
                } 
                until ($p1 -eq $p1vmc)
                }

然而,当使用它时,名称并不完全正确,因为它们有一些额外的字符如下:

vm number 1 is @{Name=HQ-Web-01a}
vm number 2 is @{Name=HQ-LinServ-01a}
vm number 3 is @{Name=HQ-Win2012-01a}

所以我使用split和trim来摆脱这些并且工作正常。

$p1vmname = Get-VMHost -Name hq-esxi-prod-01a.nsx.gss | Get-VM | select Name
$p1vmlist = @()
foreach ($p1line in $p1vmname)
            {
            $p1vmlist += $p1line
            }
                $p1 = 0
                do {
                $x = $p1+1
                $p1vmlist[$p1] = ($p1vmlist[$p1]) -split("=") | Select-Object -Last 1
                $p1vmlist[$p1] = $p1vmlist[$p1].trimend("}")
                Write-Host -BackgroundColor:Black -ForegroundColor:Yellow "vm number $x is "$p1vmlist[$p1]"."
                $p1++
                } 
                until ($p1 -eq $p1vmc)
                }

输出:

vm number 1 is  HQ-Web-01a .
vm number 2 is  HQ-LinServ-01a .
vm number 3 is  HQ-Win2012-01a .

非常感谢您的回答,这对我帮助很大。

我现在非常喜欢编写脚本。