在殼層中執行命令

PowerShell 是命令行殼層,也是用於自動化的腳本語言。 類似於其他殼層,例如 bash Linux 或 Windows 命令殼層 (cmd.exe),PowerShell 可讓您在系統上執行任何可用的命令,而不只是 PowerShell 命令。

命令的類型

對於任何操作系統中的任何殼層,有三種類型的命令:

  • Shell 語言關鍵詞 是殼層腳本語言的一部分。

    • 關鍵字的 bash 範例包括: ifthenelseelif、 和 fi
    • 關鍵字的 cmd.exe 範例包括: dircopymoveif、 和 echo
    • PowerShell 關鍵詞的範例包括: forforeachtrycatch、 和 trap

    殼層語言關鍵詞只能在殼層的運行時間環境中使用。 殼層外部沒有提供 關鍵詞功能的可執行檔。

  • OS 原生命令 是安裝在作業系統中的可執行檔。 可執行檔可以從任何命令行殼層執行,例如 PowerShell。 這包括可能需要其他殼層正常運作的腳本檔案。 例如,如果您在PowerShell中執行 Windows 批次腳本(.cmd 檔案),PowerShell 會執行 cmd.exe 並傳入批處理檔以供執行。

  • 殼層環境特定命令是在外部檔案中定義的命令 ,只能在殼層的運行時間環境中使用。 這些包括腳本和函式,也可以是特別編譯的模組,將命令新增至殼層運行時間。 在 PowerShell 中,這些命令稱為 Cmdlet(發音為 “command-lets” )。

執行原生命令

任何原生命令都可以從PowerShell命令行執行。 通常,您執行命令的方式與 在 或 cmd.exebash完全相同。 下列範例示範在 bash UbuntuLinux上執行 grep 命令。

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

在 Ubuntu 上啟動 PowerShell 之後,您可以從 PowerShell 命令行執行相同的命令:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

將自變數傳遞至原生命令

大部分殼層都包含使用變數、評估表達式和處理字串的功能。 但每個殼層都會以不同的方式執行這些動作。 在 PowerShell 中,所有參數都是以連字元 (-) 字元開頭。 在 中 cmd.exe,大部分的參數都會使用斜線 (/) 字元。 其他命令行工具可能沒有參數的特殊字元。

每個殼層都有自己的處理和評估命令行字串的方式。 在 PowerShell 中執行預期以特定方式加上字串的原生命令時,您可能需要調整傳遞這些字串的方式。

如需詳細資訊,請參閱下列文章:

PowerShell 7.2 引進了可改善原生命令處理的新實驗功能 PSnativeCommandArgumentPassing 。 如需詳細資訊,請參閱 PSnativeCommandArgumentPassing

處理輸出和錯誤

PowerShell 除了其他殼層之外,還有數個輸出數據流。 bashcmd.exe 殼層有 stdoutstderr。 PowerShell 有六個輸出數據流。 如需詳細資訊,請參閱 about_Redirectionabout_Output_Streams

一般而言,原生命令傳送至 stdout 的輸出會傳送至 PowerShell 中的 Success 數據流。 原生命令傳送至 stderr 的輸出會傳送至 PowerShell 中的錯誤 數據流。

當原生命令有非零結束代碼時, $? 會設定為 $false。 如果結束代碼為零, $? 則會設定為 $true

不過,這在 PowerShell 7.2 中有所變更。 從原生命令重新導向的錯誤記錄,例如使用重新導向運算符 (2>&1), 不會寫入 PowerShell 的 $Error 變數,而喜好設定變數 $ErrorActionPreference 不會影響重新導向的輸出。

許多原生命令會寫入 stderr 作為其他資訊的替代數據流。 當查看錯誤時,此行為可能會造成PowerShell中的混淆,如果 $ErrorActionPreference 設定為將輸出設為靜音的狀態,可能會遺失其他輸出資訊。

PowerShell 7.3 新增了新的實驗功能 PSnativeCommandErrorActionPreference ,可讓您控制輸出是否 stderr 被視為錯誤。 如需詳細資訊,請參閱 PSnativeCommandErrorActionPreference

執行 PowerShell 命令

如先前所述,PowerShell 命令稱為 Cmdlet。 Cmdlet 會收集到可視需要載入的 PowerShell 模組中。 Cmdlet 可以使用任何已編譯的 .NET 語言或使用PowerShell腳本語言本身來撰寫。

執行其他命令的 PowerShell 命令

PowerShell 呼叫運算符&) 可讓您執行儲存在變數中,並以字串或腳本區塊表示的命令。 您可以使用這個來執行任何原生命令或 PowerShell 命令。 當您需要動態建構原生命令的命令行參數時,這在腳本中很有用。 如需詳細資訊,請參閱 呼叫運算符

Start-Process Cmdlet 可用來執行原生命令,但只有在您需要控制命令的執行方式時,才應該使用。 Cmdlet 有參數可支援下列案例:

  • 使用不同的認證執行命令
  • 隱藏新進程所建立的主控台視窗
  • 重新 導向 stdinstdoutstderr 數據流
  • 針對命令使用不同的工作目錄

下列範例會使用重新導向的輸入和輸出數據流來執行原生命令 sort.exe

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

如需詳細資訊,請參閱 Start-Process

在 Windows 上 Invoke-Item ,Cmdlet 會執行指定項目的預設動作。 例如,它會執行可執行檔,或使用與檔檔類型相關聯的應用程式開啟檔檔。 默認動作取決於項目類型,並由提供專案存取權的 PowerShell 提供者解析。

下列範例會在預設網頁瀏覽器中開啟PowerShell原始程式碼存放庫。

Invoke-Item https://github.com/PowerShell/PowerShell

如需詳細資訊,請參閱 Invoke-Item