如何抑制PowerShell脚本启动的应用在控制台输出的调试信息?
问题描述
我有一个PS1脚本,用于启动一系列应用,启动opentrack的命令示例如下:
$this.apps.Add($(Start-Process "$($global:openTrackDir)\opentrack.exe" ` -WorkingDirectory "$($global:openTrackDir)" -Verb RunAs -PassThru)
使用Add方法是为了后续能通过应用引用关闭它们。但opentrack会在控制台输出调试信息:
DEBUG [C:\repos\opentrack\api/plugin-support.hpp:106]: library "kinect-face" failed: "Cannot load library C:\Program Files\opentrack\modules\\opentrack-tracker-kinect-face.dll: Can't
我尝试过相关解决方案但无效,请问如何有效消除这些控制台消息?
解决方案
方法1:通过[Diagnostics.Process]类启动(推荐,适配管理员权限+输出重定向)
当使用-Verb RunAs时,Start-Process默认启用UseShellExecute=true,此时无法直接重定向输出。改用.NET进程类可以绕开这个限制,同时保留管理员权限和进程引用:
# 创建进程对象 $process = New-Object System.Diagnostics.Process $process.StartInfo.FileName = "$($global:openTrackDir)\opentrack.exe" $process.StartInfo.WorkingDirectory = "$($global:openTrackDir)" # 请求管理员权限 $process.StartInfo.Verb = "RunAs" # 启用输出重定向(必须设置为false) $process.StartInfo.UseShellExecute = $false $process.StartInfo.RedirectStandardOutput = $true $process.StartInfo.RedirectStandardError = $true # 保留程序窗口(若不需要可设为true) $process.StartInfo.CreateNoWindow = $false # 启动进程并异步读取输出(避免阻塞) $process.Start() | Out-Null $null = $process.StandardOutput.ReadToEndAsync() $null = $process.StandardError.ReadToEndAsync() # 将进程对象加入列表,用于后续关闭 $this.apps.Add($process)
方法2:通过嵌套PowerShell进程实现管理员权限+输出抑制
如果不想用.NET类,可以通过启动一个带管理员权限的PowerShell子进程,在子进程内重定向opentrack的输出:
# 构造启动opentrack的命令,包含输出重定向 $opentrackCmd = "& ""$($global:openTrackDir)\opentrack.exe"" >NUL 2>&1" # 启动管理员权限的PowerShell进程,执行上述命令 $process = Start-Process powershell.exe -ArgumentList "-NoProfile -Command $opentrackCmd" ` -Verb RunAs -PassThru -WorkingDirectory "$($global:openTrackDir)" # 将子进程对象加入列表,后续关闭该进程会终止opentrack $this.apps.Add($process)
方法3:无管理员权限场景下直接重定向输出
如果不需要管理员权限启动opentrack,可以直接用Start-Process的重定向参数,将输出导向空设备:
$this.apps.Add($(Start-Process "$($global:openTrackDir)\opentrack.exe" ` -WorkingDirectory "$($global:openTrackDir)" -PassThru ` -RedirectStandardOutput "NUL" ` -RedirectStandardError "NUL")
内容的提问来源于stack exchange,提问作者rainbow
相关产品推荐
相关产品推荐

