一些有用的信息事先.我试图做的是使用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'"