You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本中替代Sleep,实现命令顺序执行的方法

解决PowerShell中Get-LocalGroupMember无输出的问题

问题根源分析

你的脚本出现Get-LocalGroupMember无输出的情况,并非因为Get-WmiObject提前运行,而是以下核心问题导致:

  1. 数组索引越界错误:遍历分区时$j从1开始,而$partition数组采用0-based索引,触发异常后中断后续代码执行。
  2. 无效参数导致命令异常:Get-WmiObject没有-Wait参数,该无效参数会引发命令执行异常,影响后续流程。
  3. 输出流混用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:45:27