powershell - ForEach 循环未完成列表
问题描述
所以我有一个主机名数组,我想在 45 主机上运行命令“Shutdown-VMGuest”。我想一次关闭 20 个,但是当我完成 40 个但它错过了最后 5 个时。这是下面的代码,有人知道我做错了什么吗?
[System.Collections.ArrayList]$currentStartList = @()
$i=0
foreach ($vmHost in $PowerOffList){
$i++
[void]$currentstartList.Add($vmHost)
if ($i -gt "19"){
$vmToPowerOff = Get-VM -Name $currentstartList
$Confirmation= Read-Host "`n Do you want to hard powerdown the following VMs (y/n)? $currentstartList"
if ($Confirmation -eq 'y'){
Write-Output "`n Trying to power down VMs safely: $vmToPowerOff"
try {
Shutdown-VMGuest $vmToPowerOff
}
catch {
Write-Output "`n $vmToPowerOff has failed to power off safely"
$FailedVMs.Add($vmToPowerOff)
}
#clear lists
[System.Collections.ArrayList]$currentstartList = @()
$i=0
sleep 5
}
}
}
解决方案
对于这种事情,我建议改用for
循环:
for($i = 0; $i -lt $PowerOffList.Count; $i += 20){
# grab the next 20 (or fewer) hosts
$currentStartList = $PowerOffList[$i..($i + 19)]
# prompt user to start the hosts here
}
当您将索引值数组传递给[]
PowerShell 中的索引访问器时,它只会忽略不存在的索引,因此第三次循环执行时,$PowerOffList[$i..($i + 19)]
只会导致最后 5 个项目
推荐阅读
- elasticsearch - 基于阶段 Elasticsearch 在索引翻转上添加别名
- access-control - 文档权限 Content Engine API
- javascript - 从模式的下拉列表中更新选择输入文本?
- java - 在 Java 中以字节为单位接收浮点值
- python - 完成后如何重置线程
- python - 年/季度到日期时间数据类型
- javascript - 是否可以将 js 脚本与 laravel crontab 一起使用?
- sql - SQL Server,查询多个表以获取特定日期数据的有效方法
- css - 是否总是在新值之前应用新转换?
- encryption - 密码保护与 AES 加密