如何屏蔽加载MSIAfterburner.NET.dll创建对象时的输出?
如何隐藏MSIAfterburner.NET v1.1.1在PowerShell中的对象转储输出?
我懂你的烦恼——v1.1.1版本的MSIAfterburner.NET.dll每次初始化MSI.Afterburner.HardwareMonitor对象或者调用ReloadAll()时,都会直接在控制台刷出一堆对象转储内容,而且常用的PowerShell输出抑制方法完全不管用。这其实是因为DLL内部直接调用了.NET的Console类输出内容,绕过了PowerShell的管道系统,所以Out-Null、输出重定向这类方法对它无效。
下面给你几个可行的解决办法:
方法一:用独立脚本+Start-Process隔离输出
把你的MSI Afterburner相关代码放到单独的脚本文件里,然后用Start-Process启动一个隐藏的PowerShell进程来执行它,这样所有控制台输出都会被完全隔离:
- 创建脚本文件
Run-Monitor.ps1:
Add-Type -Path .\MSIAfterburner.NET.dll $abMonitor = New-Object MSI.Afterburner.HardwareMonitor $abMonitor.ReloadAll() # 这里可以添加你需要的操作,比如获取监控数据并保存到文件 $abMonitor.HardwareItems | Select-Object Name, CurrentValue | Export-Csv -Path "MonitorData.csv" -NoTypeInformation
- 在当前PowerShell会话中调用:
Start-Process powershell.exe -ArgumentList "-NoProfile -WindowStyle Hidden -File .\Run-Monitor.ps1" -Wait
这个方法简单粗暴,完全不会让输出干扰你的当前会话。
方法二:临时重定向.NET Console输出
直接拦截.NET的控制台输出流,执行完代码后再恢复原样,这样DLL的输出就会被丢到空流里:
# 保存原始的控制台输出流 $originalConsoleOut = [Console]::Out # 创建一个空的流写入器 $nullWriter = New-Object System.IO.StreamWriter([System.IO.Stream]::Null) # 重定向Console输出到空流 [Console]::SetOut($nullWriter) # 执行你的核心代码 Add-Type -Path .\MSIAfterburner.NET.dll $abMonitor = New-Object MSI.Afterburner.HardwareMonitor $abMonitor.ReloadAll() # 恢复原始控制台输出 $nullWriter.Close() [Console]::SetOut($originalConsoleOut)
如果DLL是往错误流输出的,你可以用同样的方式重定向[Console]::Error:
$originalConsoleErr = [Console]::Error $nullErrWriter = New-Object System.IO.StreamWriter([System.IO.Stream]::Null) [Console]::SetError($nullErrWriter) # 执行代码... $nullErrWriter.Close() [Console]::SetError($originalConsoleErr)
可以把两个重定向结合起来,确保所有控制台输出都被抑制。
为什么之前的方法无效?
你试的Out-Null、*>$null这些都是针对PowerShell管道中的对象输出设计的,但这个DLL的输出是直接调用.NET的Console.WriteLine写的,完全不经过PowerShell的管道,所以这些方法自然管不住它。
内容的提问来源于stack exchange,提问作者Vadim Yuzifovich
相关产品推荐
相关产品推荐

