2017-02-27 61 views
4

事先提供了一些有用的信息。我試圖做的是使用powershell start-process和System.diagnostics.ProcessStartInfo讀取外部命令的輸出,特別是steamcmd。Powershell StandardOutput緩衝區對於外部命令太小

我正在運行的是RedirectStandardOutput緩衝區限制爲4096字節。我從steamcmd獲得的輸出超過了緩衝區,所以我只能得到我需要的一部分。除了調用steamcmd,我沒有其他方法可以獲取這些數據。

如果你有steamcmd(它是免費的)並運行它,你可以看到輸出。

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

這將下載所有有關的appid清單信息。

我試着重定向到一個文件,也是一個變量,兩者都按預期工作,只是它被緩衝區縮短了。在System.Diagnostics.Process中也沒有看到等待OutputDataReceived事件的PowerShell方法。

$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 

使用

代碼(從另一個StackOverflow的問題,被盜),我認爲實際的問題是,steamCMD只是輸出在一個大的寫入,而不是一行行。我想一個更好的問題是,如何增加Start-Process或System.Diagnostics.Process的標準輸出緩衝區大小。

注意:運行steamcmd> somefile.txt會導致相同的緩衝區限制。

回答

1

steamcmd.exe只有在從空子目錄運行時纔會正常工作,至少對於此命令行來說。

我無法解釋它,但是當我將命令放入命令兩次時,我能夠重現您的問題。

以下是解決此問題的一種方法。從空目錄運行steamcmd.exe。根據您的需要,您可以使用靜態臨時目錄並在每次運行之前清理它,或者生成一個臨時目錄並使用它並決定如何在稍後進行清理。

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'" 
+0

這仍然不會因爲標準輸出緩衝區限制工作。它全部在4096緩衝區上運行,找到一種方法來抓取更多或控制它,以便在steamcmd退出之前逐行讀取它。 –

+0

我沒有在我的機器上做這個錯誤。 PS版本5.1.14393.693。將輸出保存到一個文件中,它的長度爲269行,大小爲13KB。 –

+0

當我在PS 4.0中進行時,無論方法或文件輸出如何,我的地雷都停在221行和5k處。當我通過直接cmd和> tofile.txt完成時,它是221行。當我運行它沒有重定向輸出在CMD中,並手動將所有文本複製到文件我得到327行和15K大小。編輯:也嘗試與從portableapps.com便攜式命令提示,相同的221行/ 5K限制。 –