事先提供一些有用的信息。我正在尝试使用powershell start-process和System.diagnostics.ProcessStartInfo从外部命令(特别是steamcmd)读取输出。

我遇到的是4096个字节的RedirectStandardOutput缓冲区限制。我从steamcmd获得的输出比该缓冲区还要多,所以我只得到了我需要的一部分。除了调用steamcmd之外,我没有其他方法可以获取此数据。

如果您具有steamcmd(免费)并运行它,则也可以看到输出。

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

这将下载有关该appid的所有 list 信息。

我试图重定向到文件和变量,两者都按预期工作,只是缓冲区缩短了。 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。根据您的需要,您可以使用静态temp dir并在每次运行之前对其进行清理,或者生成一个temp dir并使用该目录并决定以后如何对其进行清理。

CODE

$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'"

关于powershell - Powershell StandardOutput缓冲区对于外部命令而言太小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42475938/

10-11 08:40