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
相关产品推荐
相关产品推荐

