我正在尝试找到一种在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
我想要一个脚本,将每个行添加到脚本中的不同变量中(不包括第一行名称)。
我该怎么做。
感谢您的帮助。
答案 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 .
非常感谢您的回答,这对我帮助很大。
我现在非常喜欢编写脚本。