我執行了以下三個 powershell 命令。前兩個命令沒有回傳結果,第三個命令回傳結果。這三個命令之間的主要區別在于等待引數和括號的使用。
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/IC:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru | Foreach-Object -Process { $_.exitcode }
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/IC:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -wait | Foreach-Object -Process { $_.exitcode }
PS C:\Users> (啟動行程 -FilePath 'msiexec' -ArgumentList '/IC:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -Wait)| Foreach-Object -Process { $_.exitcode }
1619
我測驗了另外兩個命令,它們之間的區別在于括號的使用。無論帶括號,這兩個命令都回傳結果。
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/IC:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru | Foreach-Object -Process { $_.id }
22980
PS C:\Users> (啟動行程 -FilePath 'msiexec' -ArgumentList '/IC:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -Wait)| Foreach-Object -Process { $_.id }
8064
感謝您對 -wait 引數的解釋。我仍然對括號造成的差異感到困惑。希望得到更多的答復。
uj5u.com熱心網友回復:
三個命令的主要區別在于
-Wait引數和括號的使用
以Mathias R. Jessen的有用評論為基礎:
它是主要使用Start-Process的-Wait開關所需要:
沒有
-Wait,異步Start-Process運行。如果沒有
-PassThru,Start-Process會產生任何輸出。
雖然-PassThru品牌Start-Process輸出System.Diagnostics.Process代表新推出的程序中,例如除非-Wait是也本該實體的.ExitCode屬性沒有值還,因為啟動的程序通常還沒有退出。
此外,括號((...))需要太多,因為Start-Process發出的System.Diagnostics.Process實體表示新推出的程序中對管道(由所收到ForEach-Object)馬上,并且然后等待行程退出。通過使用(...),在分組操作,你迫使等待Start-Process 自己退出,此時Process“實體.ExitCode屬性是可用的,感謝-Wait。
在一般情況下,包裝在一個命令(...)的力收集它的輸出在全,前面-其中包括等待它退出-的結果通過管道傳遞之前(相對于所述流(一個接在輸出)的行為是默認值,在命令仍在運行時發生)。
因此,以下作業 - 但請參閱底部以獲取更簡單的替代方案:
# Note: With (...), you could also pipe the output to ForEach-Object, as in
# your question, but given that there's by definition only *one*
# output object, that is unnecessary.
(
Start-Process -PassThru -Wait -FilePath 'msiexec' -ArgumentList '/i C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet'
).ExitCode
從上面可以看出,使用兩個單獨的陳述句也可以作業(假設任何陳述句在執行下一個陳述句之前運行到完成):
$process = Start-Process -PassThru -Wait -FilePath 'msiexec' -ArgumentList '/i C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet'
$process.ExitCode
msiexec.exe是不同尋常在于:
它是一個GUI(-subsystem)可執行檔案(與控制臺(-subsystem)可執行檔案相反),因此 - 即使直接呼叫- 也可以異步運行。
但它會報告呼叫者可能感興趣的有意義的行程退出代碼,要求呼叫者等待其退出(終止)以確定此退出代碼。
順便說一句:對于呼叫控制臺應用程式,Start-Process通常不是正確的工具,除非在不尋常的情況下 - 請參閱此答案。
使用with 的一個更簡單的替代方法是使用直接呼叫 via,這可以確保 (a)同步呼叫和 (b) PowerShell在其自動變數中反映的退出代碼:msiexecStart-Process -PassThru -Waitcmd /cmsiexec$LASTEXITCODE
cmd /c 'msiexec /i C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet'
$LASTEXITCODE # output misexec's exit code
注意:如果在msiexec命令列中需要包括PowerShell的變數值,通過一個可擴展的(雙引號)的字串("...")來cmd /c代替和-與逐字(單引號)的字串('...')弦-使用嵌入式雙引號周圍嵌入引數,如必要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409800.html
標籤:
