Powershell StandardOutput缓冲区对于外部命令来说太小了

一些有用的信息事先.我试图做的是使用power
shell start-process和System.diagnostics.ProcessStartInfo读取外部命令的输出,特别是steamcmd.

我遇到的是RedirectStandardOutput缓冲区限制为4096字节.我从steamcmd获得的输出不仅仅是那个缓冲区,所以我只得到了我需要的一部分.除了调用steamcmd之外,我没有其他方法来获取此数据.

如果你有steamcmd(它是免费的)并运行它,你也可以看到输出.

steamcmd +login anonymous +app_info_update 1 +app_info_print 443030 +quit

这将下载有关该appid的所有清单信息.

我试图重定向到一个文件和一个变量,两者都按预期工作,只是它被缓冲区缩短了. System.Diagnostics.Process中似乎没有一个powershell方法来等待OutputDataReceived事件.

使用的代码(从另一个STackOverflow问题中窃取)

$psi = New-object System.Diagnostics.ProcessStartInfo 
$psi.CreateNoWindow = $true 
$psi.UseShellExecute = $false 
$psi.RedirectStandardOutput = $true 
$psi.RedirectStandardError = $true 
$psi.FileName = "C:\Path\to\SteamCMD.exe"
$psi.Arguments = "+login anonymous +app_info_update 1 +app_info_print 443030 +quit"
$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $psi 
[void]$process.Start()
$output = $process.StandardOutput.ReadToEnd()
$process.WaitForExit() 
$output

我认为实际问题是steamCMD只是输出一次大写而不是逐行输出.我想更好的问题是,如何增加Start-Process或System.Diagnostics.Process的标准输出缓冲区大小.

注意:运行steamcmd> somefile.txt导致相同的缓冲区限制.

最佳答案 steamcmd.exe似乎只在从空子目录运行时才能正常工作,至少对于此命令行而言.

我无法解释,但是当我两次执行命令时,我能够重新解决你的问题.

这是解决问题的一种方法.从空目录运行steamcmd.exe.根据您的需要,您可以使用静态临时目录并在每次运行之前清除它,或者生成临时目录并使用它并决定如何在以后清理它.

$steamcmd = "L:\test\steam\steamcmd.exe"

# steam works best if run in an empty directory
# why, i have no clue...

$tempName = [System.IO.Path]::GetRandomFileName()
$parentDir = Split-Path $steamcmd -Parent
$tempPath = Join-Path $parentDir $tempName
$null = New-Item $tempPath -ItemType Directory
$null = Copy-Item $steamcmd $tempPath

Write-Output "temp directory is '$tempPath'"

$steamcmdTemp = Join-Path $tempPath 'steamcmd.exe'

Write-Output "Running '$steamcmdTemp'..."
$output = & $steamcmdTemp +login anonymous +app_info_update 1 +app_info_print 443030 +quit

$now = [DateTime]::Now.ToString("yyyyMMdd HHmmss")
$outFile = "output {0}.txt" -f $now
$outputFile = Join-Path $parentDir $outFile

Write-Output "Saving output to '$outputFile'"
$output | Out-File $outputFile -Force


# todo: deal with removing the temp dir...
# or keep cleaning and reusing a static name...

Write-Output "Remember to cleanup '$tempPath'"
点赞