PowerShell中Get-WmiObject文件位置查询及代码修改可行性咨询
关于PowerShell中Get-WmiObject的相关问题
1. Get-WmiObject的文件位置
Get-WmiObject并非独立的脚本或可执行文件,它是PowerShell的内置Cmdlet,核心实现代码包含在PowerShell的系统.NET程序集中(如System.Management.Automation.dll),相关文件的默认路径如下:
- Windows PowerShell(v1.0):
C:\Windows\System32\WindowsPowerShell\v1.0 - PowerShell 7+(跨平台版本):默认安装目录下的核心程序集,比如
C:\Program Files\PowerShell\7
你可以通过以下命令查看它的归属模块及模块路径:
# 查看Cmdlet的来源模块 Get-Command Get-WmiObject | Select-Object Source, CommandType # 查看模块的安装路径 Get-Module Microsoft.PowerShell.Management | Select-Object ModuleBase
2. 修改Get-WmiObject实现自定义功能是否可行?如何操作?
直接修改内置Cmdlet的底层代码不可行——系统程序集带有数字签名,修改后会破坏签名导致PowerShell拒绝加载,且这类文件受系统保护,强行修改可能引发稳定性问题。但可以通过以下合法方式实现自定义需求:
方式一:创建同名函数覆盖内置Cmdlet
编写一个与Get-WmiObject同名的PowerShell函数,让它优先于内置Cmdlet执行,在函数内调用原Cmdlet并修改输出:
function Get-WmiObject { # 调用原始Cmdlet,保留所有传入参数 $originalOutput = Microsoft.PowerShell.Management\Get-WmiObject @PSBoundParameters # 自定义修改逻辑,比如添加新属性、过滤结果 $modifiedOutput = $originalOutput | Select-Object *, @{Name='CustomTag'; Expression={'自定义标记'}} # 返回修改后的结果 return $modifiedOutput }
将这个函数保存到你的PowerShell配置文件(执行$PROFILE可查看路径),每次启动PowerShell都会自动加载。若需临时恢复原Cmdlet,执行Remove-Item function:Get-WmiObject即可。
方式二:创建独立包装函数
如果不想覆盖原Cmdlet,可创建一个新函数封装逻辑,比如Get-CustomWmiObject:
function Get-CustomWmiObject { # 复制原Cmdlet的参数定义 param( [Parameter(Mandatory=$true)] [string]$Class, [string]$ComputerName # 按需添加其他参数 ) $originalResult = Get-WmiObject -Class $Class -ComputerName $ComputerName # 自定义输出处理,比如修改字段格式、过滤结果 $originalResult | Where-Object { $_.State -eq 'Running' } | Select-Object Name, ProcessId, @{Name='MemUsageMB'; Expression={[math]::Round($_.WorkingSetSize/1MB, 2)}} }
方式三:临时管道处理输出
如果仅需修改单次命令的输出,无需修改Cmdlet本身,直接通过管道结合Select-Object、ForEach-Object处理即可:
# 示例:修改Win32_Process的输出,将内存占用转为MB单位 Get-WmiObject -Class Win32_Process | Select-Object ProcessId, Name, @{Name='MemMB'; Expression={[math]::Round($_.WorkingSetSize/1MB,2)}}
注意:切勿尝试修改系统自带的PowerShell程序集或模块文件,这会导致系统兼容性问题,且Windows系统下这类文件通常无法直接编辑。
内容的提问来源于stack exchange,提问作者Twfyq Bhyry
相关产品推荐
相关产品推荐

