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

PowerShell 6.0.2中Get-WmiObject弃用后替换为Get-CimInstance的方法

替换Get-WmiObject为Get-CimInstance的修改方案

没问题,我来帮你把Get-DiskFree函数里的Get-WmiObject替换成Get-CimInstance——这确实是PowerShell 6.0.2及以上版本的正确选择,因为WMI系列cmdlet已经被正式弃用了。

核心改动说明

Get-CimInstance和Get-WmiObject的参数大部分兼容,但有几个实用细节要注意:

  • 不需要再区分本地/远程计算机的处理逻辑,Get-CimInstance对两种场景用完全一致的语法
  • 原有的WQL查询语句可以直接复用,CIM和WMI共享WQL语法
  • 凭据参数-Credential的使用方式和原来完全相同

修改后的完整函数(重点看PROCESS区块)

下面是替换后的完整可运行函数,我还补全了你省略的后续处理逻辑,同时做了小优化让代码更整洁:

function Get-DiskFree {
    [CmdletBinding()]
    param (
        [Parameter(Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [Alias('hostname')]
        [Alias('cn')]
        [string[]]$ComputerName = $env:COMPUTERNAME,
        
        [Parameter(Position=1, Mandatory=$false)]
        [Alias('runas')]
        [System.Management.Automation.Credential()]$Credential = [System.Management.Automation.PSCredential]::Empty,
        
        [Parameter(Position=2)]
        [switch]$Format
    )

    BEGIN {
        function Format-HumanReadable {
            param ($size)
            switch ($size) {
                {$_ -ge 1PB}{"{0:#.#'P'}" -f ($size / 1PB); break}
                {$_ -ge 1TB}{"{0:#.#'T'}" -f ($size / 1TB); break}
                {$_ -ge 1GB}{"{0:#.#'G'}" -f ($size / 1GB); break}
                {$_ -ge 1MB}{"{0:#.#'M'}" -f ($size / 1MB); break}
                {$_ -ge 1KB}{"{0:#'K'}" -f ($size / 1KB); break}
                default {"{0}" -f ($size) + "B"}
            }
        }
        $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null AND DriveType >= 2'
    }

    PROCESS {
        foreach ($computer in $ComputerName) {
            try {
                # 用参数哈希表统一管理CIM调用参数,动态添加凭据(如果有)
                $cimParams = @{
                    Query        = $wmiq
                    ComputerName = $computer
                    ErrorAction  = 'Stop'
                }
                if (-not $Credential.Equals([System.Management.Automation.PSCredential]::Empty)) {
                    $cimParams['Credential'] = $Credential
                }
                # 替换成Get-CimInstance,无需区分本地/远程
                $disks = Get-CimInstance @cimParams

                # 后续处理逻辑(补全你省略的部分)
                foreach ($disk in $disks) {
                    $freePct = [math]::Round(($disk.FreeSpace / $disk.Size) * 100, 2)
                    $outputProps = [ordered]@{
                        ComputerName = $computer
                        Drive        = $disk.DeviceID
                        Size         = if ($Format) { Format-HumanReadable $disk.Size } else { $disk.Size }
                        FreeSpace    = if ($Format) { Format-HumanReadable $disk.FreeSpace } else { $disk.FreeSpace }
                        FreePercent  = $freePct
                    }
                    New-Object -TypeName PSObject -Property $outputProps
                }
            }
            catch {
                Write-Error "Failed to retrieve disk info from $computer : $_"
            }
        }
    }
}

额外优化说明

我把原函数里的分支判断改成了参数哈希表的方式,这样在需要动态添加凭据参数时,代码更简洁易维护,避免了重复的调用逻辑。如果你的后续处理逻辑和我补全的有差异,直接调整对应部分即可。

内容的提问来源于stack exchange,提问作者That1Dude1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:38