在殼層中執行命令
PowerShell 是命令行殼層,也是用於自動化的腳本語言。 類似於其他殼層,例如 bash
Linux 或 Windows 命令殼層 (cmd.exe
),PowerShell 可讓您在系統上執行任何可用的命令,而不只是 PowerShell 命令。
命令的類型
對於任何操作系統中的任何殼層,有三種類型的命令:
Shell 語言關鍵詞 是殼層腳本語言的一部分。
- 關鍵字的
bash
範例包括:if
、then
、else
、elif
、 和fi
。 - 關鍵字的
cmd.exe
範例包括:dir
、copy
、move
、if
、 和echo
。 - PowerShell 關鍵詞的範例包括:
for
、foreach
、try
、catch
、 和trap
。
殼層語言關鍵詞只能在殼層的運行時間環境中使用。 殼層外部沒有提供 關鍵詞功能的可執行檔。
- 關鍵字的
OS 原生命令 是安裝在作業系統中的可執行檔。 可執行檔可以從任何命令行殼層執行,例如 PowerShell。 這包括可能需要其他殼層正常運作的腳本檔案。 例如,如果您在PowerShell中執行 Windows 批次腳本(
.cmd
檔案),PowerShell 會執行cmd.exe
並傳入批處理檔以供執行。殼層環境特定命令是在外部檔案中定義的命令 ,只能在殼層的運行時間環境中使用。 這些包括腳本和函式,也可以是特別編譯的模組,將命令新增至殼層運行時間。 在 PowerShell 中,這些命令稱為 Cmdlet(發音為 “command-lets” )。
執行原生命令
任何原生命令都可以從PowerShell命令行執行。 通常,您執行命令的方式與 在 或 cmd.exe
中bash
完全相同。 下列範例示範在 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 除了其他殼層之外,還有數個輸出數據流。 bash
和 cmd.exe
殼層有 stdout 和 stderr。 PowerShell 有六個輸出數據流。 如需詳細資訊,請參閱 about_Redirection 和 about_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 有參數可支援下列案例:
- 使用不同的認證執行命令
- 隱藏新進程所建立的主控台視窗
- 重新 導向 stdin、 stdout 和 stderr 數據流
- 針對命令使用不同的工作目錄
下列範例會使用重新導向的輸入和輸出數據流來執行原生命令 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。