【问题标题】:For loop for Array in PowershellPowershell中数组的for循环
【发布时间】:2020-10-18 10:18:51
【问题描述】:

我有如下示例代码:

$IP=@("IP1","IP2","IP3", "IP4" , "IP5")
$Hostname=@("Host1","Host2","Host3","HOST4", "HOST5")

$data = Read-Host -Prompt 'Please enter the data.'

if ($data -match 'zone1') {
    $Unity=$IP[0]
    $show=$hostname[0]
} elseif ($data -match 'site2'){
    $Unity=$IP[1]
    $show=$hostname[1]
} elseif ($data -match 'unit5'){
    $Unity=$IP[2]
    $show=$hostname[2]
} elseif ($data -match 'ALL DC'){
    $Unity=$IP
    $show=$hostname
}



foreach ($u in $Unity){

  echo "This is my IP" $u
  echo "This is my hostname" $show

}

除所有 DC 之外的所有选项的代码工作都很好。 我想运行一些使用主机名和 Ip 的命令。

用户输入所有 DC 时的期望输出为

这是我的 IP IP1 这是我的主机名 主机1 这是我的IP IP2 这是我的主机名 主机2 这是我的IP IP3 这是我的主机名 主机3 这是我的IP IP4 这是我的主机名 主机4 这是我的IP IP5 这是我的主机名 主机5

【问题讨论】:

  • 这是实际代码吗?在分配之前访问$data
  • @marsze-这是示例代码,我已经更正了
  • 目前还不清楚您实际想要达到的目标。请更好地解释您的意图,并包括预期的输入/输出
  • @marsze 如果您将运行上述代码并将输入作为 ALL DC,您将了解我的问题。对于一个 IP,它显示所有主机名
  • 是的,因为您分配了所有主机名$show = $hostname。您到底希望输出是什么?将其添加到您的问题中!

标签: arrays powershell for-loop


【解决方案1】:

如果我理解您要正确执行的操作,我可能不会为此使用单独的数组,而是使用一个包含 objects 的单个数组,以便将单位、ip 和主机名保持在一起。

那么你可以这样做:

$units = [PsCustomObject]@{unit = 'zone1'  ; ip = 'IP1'; hostname = 'Host1'},
         [PsCustomObject]@{unit = 'site2'  ; ip = 'IP2'; hostname = 'Host2'},
         [PsCustomObject]@{unit = 'unit5'  ; ip = 'IP3'; hostname = 'Host3'},
         [PsCustomObject]@{unit = 'region3'; ip = 'IP4'; hostname = 'Host4'},
         [PsCustomObject]@{unit = 'zone5'  ; ip = 'IP5'; hostname = 'Host5'}

$data = Read-Host -Prompt 'Please enter the unit'

$choice = if (![string]::IsNullOrWhiteSpace($data)) { $units | Where-Object { $_.unit -match $data }}
if ($choice) {
    Write-Host "You have chosen:" -ForegroundColor Green
    $choice | Format-Table -AutoSize
}
else {
    Write-Host "You have given invalid input.." -ForegroundColor Red
    Write-Host "These are all DC's:"
    $units | Format-Table -AutoSize
}

这是你的意图吗?如果没有,请edit您的问题更清楚。

【讨论】:

  • 您的代码很好,但在此,我不得不提到一大堆命令,它们在我试图避免的 if 和 else 语句下使用变量 IP 和主机名两次。
  • @GURUSINGH 问题中没有提到这一点。但是,我没有看到问题所在。在if {} 中,您使用$choice.ip$choice.hostname 执行某些操作,而在else{} 中您执行不同的操作,循环遍历$units 数组中的所有项目。
【解决方案2】:

您可以通过使用switch 而不是if/elseif/else 来减少所需的分配数量,然后只选择数组索引(而不是目标项):

$indices = switch -regex ($data){
    'zone1' { 0 }
    'site2' { 1 } 
    'unit5' { 2 }
    'ALL DC' { 0..4 }
}

$Unity=$IP[$indices]
$show=$hostname[$indices]

现在您只需将foreach 循环替换为for 循环:

for($i = 0; $i -lt $Indices.Length; $i++){
  $u = $Unity[$i]
  $h = $show[$i]

  echo "This is my IP" $u
  echo "This is my hostname" $h
}

或者,在让用户选择之前基于原始数组构造对象:

$IP=@("IP1","IP2","IP3", "IP4" , "IP5")
$Hostname=@("Host1","Host2","Host3","HOST4", "HOST5")

# construct a new array of objects with corresponding IP-Host details
$HostIPDetails = for($i = 0; $i -lt $IP.Length; $i++){
  [pscustomobject]@{ IP = $IP[$i]; HostName = $Hostname[$i] }
}

$data = Read-Host 'Input the data... '

$indices = switch -regex ($data){
    'zone1' { 0 }
    'site2' { 1 } 
    'unit5' { 2 }
    'ALL DC' { 0..4 }
}

foreach($machine in $HostIPDetails[$indices]){
  echo "This is my IP" $machine.IP
  echo "This is my hostname" $machine.HostName 
}

【讨论】:

  • 非常感谢 Theo 和 Mathias 的帮助和努力。
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 2020-01-27
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2018-12-03
  • 2017-01-03
相关资源
最近更新 更多