[英]Running PowerShell from another shell with Tee
我想學習從另一個 shell 或語言(例如 Python os.system()
執行 PowerShell 命令。 我想要實現的是以下內容:
我認為這給出了我想要實現的想法,假設使用 cmd.exe 作為調用者環境:
powershell -NoProfile -command "& { cat foo.txt | Tee-Object ps-log.txt; exit $LASTEXITCODE }"
echo %errorlevel%
這里有一些問題。 首先,我不能在命令中使用引號,例如:
powershell -NoProfile -command "& { cat `"foo bar.txt`" | Tee-Object ps-log.txt; exit $LASTEXITCODE }"
cat
參數似乎是不帶引號傳遞的,因此cat
會查找“bar.txt”參數。
我認為$LASTEXITCODE
很快就會擴展,即在執行cat
之前。
&
使用不方便,因為它不接受包括 arguments 在內的單個命令行字符串。 &
的替代方法是iex
,但是我不能從 cmd.exe 使用它。 實際上:
powershell -NoProfile -command {iex cat foo.txt}
返回:
iex cat foo.txt
從cmd.exe
中,使用以下命令( -c
是-Command
的縮寫):
C:\>powershell -NoProfile -c "Get-Content \"foo bar.txt\" | Tee-Object ps-log.txt; exit -not $?"
沒有理由在傳遞給-Command
的字符串中使用& {... }
- 只需使用...
代替。
將嵌入的"
chars. as \"
轉義(PowerShell (Core) 7+ 也接受""
)。
-Command
/ -c
的"..."
字符串中使用'...'
(單引號),假設不需要字符串插值。 由於該命令僅涉及PowerShell 原生命令(在 Windows 上, cat
只是Get-Content
的別名),因此未設置$LASTEXITCODE
,因為它僅反映外部程序的退出代碼。 相反, 自動$?
變量適用,它是一個Boolean ,指示最近執行的管道中的命令是否發出任何錯誤。
-not
否定這個值意味着$true
轉換為$false
和$false
轉換為$true
,並且這些值轉換為外部整數, $false
映射到0
和$true
到1
。Powershell 支持單引號,這在這種情況下為我節省了很多次。 這樣做的好處是:它們明確且易於閱讀。 但請注意,變量擴展在單引號字符串中不起作用。
powershell -NoProfile -command "cat 'foo bar.txt' | tee ps-log.txt"
除此之外,請查看 mklement0 的答案中的有用建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.