PowerShell脚本中替代Sleep,实现命令顺序执行的方法
解决PowerShell中Get-LocalGroupMember无输出的问题
问题根源分析
你的脚本出现Get-LocalGroupMember无输出的情况,并非因为Get-WmiObject提前运行,而是以下核心问题导致:
- 数组索引越界错误:遍历分区时
$j从1开始,而$partition数组采用0-based索引,触发异常后中断后续代码执行。 - 无效参数导致命令异常:
Get-WmiObject没有-Wait参数,该无效参数会引发命令执行异常,影响后续流程。 - 输出流混用:
Write-Host和Write-Output混用可能造成显示顺序混乱,误导判断为命令执行顺序问题。
替代Sleep的解决方案
无需依赖Sleep,修复脚本错误并采用更可靠的命令实现,即可确保命令按顺序执行并正常输出:
修改后的完整脚本
#Run as administrator# param([switch]$Elevated) function Test-Admin { $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) } if ((Test-Admin) -eq $false) { if ($elevated) { # tried to elevate, did not work, aborting } else { Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition)) } exit } 'running with full privileges' #hardware# Write-Host "----------------------------------------" Write-Host " #######Hardware info#########" Write-Host "----------------------------------------`r`n" Write-Output ("CPU is $((Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors)") cmd.exe /c WMIC CPU Get DeviceID,NumberOfCores,NumberOfLogicalProcessors Write-Output ("Ram is $(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))})") $disks = Get-Disk For ($i=0; $i -lt $disks.Length ; $i++) { Write-Output("Disk $($i) is selected now") # 直接获取分区集合,无需手动构建数组 $partitions = Get-Partition -DiskNumber $i | Select-Object DiskNumber,PartitionNumber,DriveLetter,IsActive,@{Name="Size, Gb"; Expression={[int]($_.Size/1GB)}},Type Write-Output("partitons in disk $($i)") Write-Host ($partitions | Format-Table | Out-String) # 修复索引:从0开始遍历分区 For ($j=0; $j -lt $partitions.Length ; $j++) { if( $partitions[$j].DriveLetter -ne $null) { Write-Output("volume in disk $($i)") $volume = Get-Volume -DriveLetter $partitions[$j].DriveLetter -ErrorAction SilentlyContinue | Select DriveLetter,FriendlyName,FileSystemType,HealthStatus,OperationalStatus, @{Name="SizeRemaining, Gb"; Expression={[int]($_.SizeRemaining/1GB)}}, @{Name="Size, Gb"; Expression={[int]($_.Size/1GB)}} Write-Host ($volume | Format-Table | Out-String) } } } # 用Get-CimInstance替代Get-WmiObject,移除无效参数,确保正常执行 Get-CimInstance -Class Win32_LogicalDisk | Select Deviceid,volumename #Domain# Write-Host "----------------------------------------" Write-Host "############Domain and Domain Controller info#############" Write-Host "----------------------------------------`r`n" Write-Output("Computer name is $(hostname)") Write-Output("$(cmd /c echo %USERDOMAIN%)") Write-Output("$($env:LOGONSERVER)") #users# Write-Host "----------------------------------------" Write-Host "############Users#############" Write-Host "----------------------------------------`r`n" # 确保输出完整显示 Get-LocalGroupMember -Group "Administrators" | Format-Table | Out-String | Write-Host
关键修改点
- 修复数组索引:将分区遍历的
$j起始值改为0,避免越界错误。 - 替换WMI命令:用微软推荐的
Get-CimInstance替代Get-WmiObject,移除无效的-Wait参数,提升稳定性。 - 简化分区获取逻辑:直接将
Get-Partition结果赋值给变量,无需手动构建数组,减少出错概率。 - 统一输出逻辑:将
Get-LocalGroupMember的结果转换为字符串后输出,确保完整显示。
内容的提问来源于stack exchange,提问作者user3737708
相关产品推荐
相关产品推荐

