簡體   English   中英

使用 Tee 從另一個 shell 運行 PowerShell

[英]Running PowerShell from another shell with Tee

我想學習從另一個 shell 或語言(例如 Python os.system()執行 PowerShell 命令。 我想要實現的是以下內容:

  1. 執行 PowerShell 命令
  2. 將 output 連接到控制台和文件
  3. 返回命令退出代碼

我認為這給出了我想要實現的想法,假設使用 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+ 也接受"" )。

  • 由於該命令僅涉及PowerShell 原生命令(在 Windows 上, cat只是Get-Content的別名),因此設置$LASTEXITCODE ,因為它僅反映外部程序的退出代碼。 相反, 自動$? 變量適用,它是一個Boolean ,指示最近執行的管道中的命令是否發出任何錯誤。

    • -not否定這個值意味着$true轉換為$false$false轉換為$true ,並且這些值轉換為外部整數$false映射到0$true1

Powershell 支持單引號,這在這種情況下為我節省了很多次。 這樣做的好處是:它們明確且易於閱讀。 但請注意,變量擴展在單引號字符串中不起作用。

powershell -NoProfile -command "cat 'foo bar.txt' | tee ps-log.txt"

除此之外,請查看 mklement0 的答案中的有用建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM