我在 Powershell 中使用以下命令在后臺轉換檔案,但想將結果全部記錄在一個檔案中。現在 -RedirectStandardOutput 每次運行都會替換檔案。
foreach ($l in gc ./files.txt) {Start-Process -FilePath "c:\Program Files (x86)\calibre2\ebook-convert.exe" -Argumentlist "'$l' '$l.epub'" -Wait -WindowStyle Hidden -RedirectStandardOutput log.txt}
我嘗試了重定向,但日志為空。如果可能的話,我想把它保持為單線。
foreach ($l in gc ./files.txt) {Start-Process -FilePath "c:\Program Files (x86)\calibre2\ebook-convert.exe" -Argumentlist "`"$l`" `"$l.epub`"" -Wait -WindowStyle Hidden *> log.txt}
uj5u.com熱心網友回復:
如果不使用 ,則可以使用重定向并附加到檔案Start-Process,而是直接呼叫:
foreach ($l in gc ./files.txt) {& 'C:\Program Files (x86)\calibre2\ebook-convert.exe' "$l" "$l.epub" *>> log.txt}
uj5u.com熱心網友回復:
如果順序、同步執行是可接受的,您可以簡化命令以使用單個輸出重定向(假設是ebook-convert.exe控制臺子系統應用程式,因此 PowerShell同步執行(以阻塞方式)。:
Get-Content ./files.txt | ForEach-Object {
& 'c:\Program Files (x86)\calibre2\ebook-convert.exe' $_ "$_.epub"
} > log.txt
如果要控制字符編碼,請使用Out-File- 它>實際上是 - 的別名及其-Encoding引數;或者,最好使用文本輸出——外部程式輸出總是在 PowerShell 中—— Set-Content。
請注意,PowerShell 永遠不會將來自外部程式的原始輸出傳遞給檔案——它們總是首先根據存盤在其中的編碼(默認情況下系統的活動舊版 OEM 代碼頁)解碼[Console]::OutputEncoding為 .NET 字串,然后在保存到時重新編碼使用檔案寫入 cmdlet 自己的默認值的檔案,除非被覆寫-Encoding- 請參閱此答案以獲取更多資訊。
如果您想要異步、并行執行(例如 via Start-Process,默認情況下是異步的),您最好的選擇是:
寫入單獨的(臨時)檔案:
在每次呼叫中將不同的輸出檔案傳遞給
-RedirectStandardOutput/ 。-RedirectStandardError請注意,如果您想合并stdout 和 stderr 輸出并將其捕獲到同一個檔案中,則必須通過 shell(可能是另一個 PowerShell 實體)呼叫您的
.exe檔案并使用其重定向功能;對于 PowerShell,它將是;對于(如下所示),它將是*>log.txtcmd.exe> log.txt 2>&1
等待所有啟動的行程完成:
傳遞
-PassThru并Start-Process收集回傳的程序資訊物件。然后使用
Wait-Process等待所有行程終止;根據需要使用-Timeout引數。
然后將它們合并到一個日志檔案中。
這是一個實作:
$procsAndLogFiles =
Get-Content ./files.txt | ForEach-Object -Begin { $i = 0 } {
# Create a distinct log file for each process,
# and return its name along with a process-information object representing
# each process as a custom object.
$logFile = 'log{0:000}.txt' -f $i
[pscustomobject] @{
LogFile = $logFile
Process = Start-Process -PassThru -WindowStyle Hidden `
-FilePath 'cmd.exe' `
-ArgumentList '/c', "`"c:\Program Files (x86)\calibre2\ebook-convert.exe`" `"$_`" `"$_.epub`" > `"$logFile`" 2>&1"
}
}
# Wait for all processes to terminate.
# Add -Timeout and error handling as needed.
$procsAndLogFiles.Process | Wait-Process
# Merge all log files.
Get-Content -LiteralPath $procsAndLogFiles.LogFile > log.txt
# Clean up.
Remove-Item -LiteralPath $procsAndLogFiles.LogFile
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/473008.html
