为何仅带输出重定向时PowerShell才捕获git config输出?如何免临时文件捕获?
提升权限PowerShell捕获git config输出的特殊现象解析及无临时文件解决方案
现象原因
git for Windows的git config命令在非提升权限环境下运行时,存在特殊输出行为:它会直接通过Windows控制台API将内容写入控制台缓冲区,而非标准输出流(stdout)。
当在提升权限的PowerShell中直接启动非提升的git config进程时,由于权限上下文隔离,PowerShell无法捕获这种绕过标准流的控制台输出。但通过BAT文件调用并使用>dummy.txt重定向时,BAT命令解释器会在创建git config进程时强制覆盖其标准输出句柄,将所有输出(包括直接写控制台的内容)导向文件,从而绕开了PowerShell权限环境下的捕获限制。
而dir、echo等常规命令始终使用标准输出流,因此无论是否重定向,提升权限的PowerShell都能正常捕获其输出。
无临时文件的捕获方法
方法1:通过cmd中转捕获输出
利用cmd命令解释器的重定向能力,将git config的输出转为标准流,再由提升权限的PowerShell捕获:
$gitConfigOutput = cmd /c "git config --list 2>&1"
其中2>&1用于同时捕获标准错误流,避免遗漏错误信息。
方法2:通过进程API直接捕获
借助.NET进程启动API,强制重定向git config的输出流,同时指定非提升权限运行:
$processStartInfo = [System.Diagnostics.ProcessStartInfo]@{ FileName = "git" Arguments = "config --list" RedirectStandardOutput = $true RedirectStandardError = $true UseShellExecute = $false # 指定非提升权限运行(适用于当前PowerShell已提升的场景) Verb = "runasuser" UserName = $env:USERNAME } $process = [System.Diagnostics.Process]::Start($processStartInfo) $process.WaitForExit() $output = $process.StandardOutput.ReadToEnd() $errorOutput = $process.StandardError.ReadToEnd() $fullOutput = $output + $errorOutput
该方法需要确保当前用户有权限以非提升身份启动进程,相比cmd中转方式更复杂,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者BlueMonkMN
相关产品推荐
相关产品推荐

