共用方式為


關於剖析

簡短描述

描述 PowerShell 如何剖析命令。

詳細描述

當您在命令提示字元中輸入命令時,PowerShell 會將命令文字分成一系列稱為 Token 的區段,然後決定如何解譯每個令牌。

例如,如果您輸入:

Write-Host book

PowerShell 會將命令分成兩個標記, Write-Host 並使用 book兩種主要剖析模式之一獨立解譯每個令牌:表達式模式和自變數模式。

注意

當 PowerShell 剖析命令輸入時,它會嘗試將命令名稱解析為 Cmdlet 或原生可執行檔。 如果命令名稱沒有完全相符的專案,PowerShell 會在命令前面加上 Get- 作為默認動詞命令。 例如,PowerShell 會 Process 剖析為 Get-Process。 基於下列原因,不建議使用此功能:

  • 效率不佳。 這會導致PowerShell多次搜尋。
  • 系統會先解析具有相同名稱的外部程式,因此您可能不會執行預期的 Cmdlet。
  • Get-HelpGet-Command 無法辨識無動詞的名稱。

表達式模式

表達式模式適用於合併表示式,這是腳本語言中值操作的必要專案。 表達式是PowerShell語法中值的表示法,而且可以是簡單或複合的,例如:

常值表達式是其值的直接表示法:

'hello', 32

變數運算式具有其參考的變數值:

$x, $script:path

運算子結合其他運算式以進行評估:

- 12, -not $Quiet, 3 + 7, $input.Length -gt 1
  • 字元字串常值 必須包含在引號中。
  • 除非逸出) ,否則數位會被視為數值,而不是 (一系列字元。
  • 運算子,包括 和 等--not等二+-gt元運算符,都會解譯為運算符,並在其自變數上套用其個別運算, (操作數) 。
  • 屬性和轉換運算式 會剖析為表示式,並套用至次級運算式,例如 [int] '7'
  • 變數參考 會評估為其值,但 ( 即,禁止貼上預先填入的參數集) ,並造成剖析器錯誤。
  • 任何其他項目都會被視為要叫用的命令。

自變數模式

剖析時,PowerShell 會先將輸入解譯為表達式。 但是遇到命令調用時,剖析會繼續處於自變數模式。

自變數模式是設計來剖析殼層環境中命令的自變數和參數。 除非使用下列其中一個語法,否則所有輸入都會被視為可展開的字串:

  • 貨幣符號 ($) 只有在變數後面接著有效的變數名稱時,才會開始變數參考 (,否則會解譯為可展開字串) 的一部分。
  • 引號 ('") 開始字串值
  • 括號 (()) 描述新的運算式。
  • 子表達式運算子 ($(...)) 分派內嵌運算式。
  • 大括弧 ({}) 分割新的腳本區塊。
  • 在符號 (@) 開始表示式語法,例如展開 () @args 、陣列 @(1,2,3) () 和哈希表 (@{a=1;b=2}) 。
  • 逗號 (,) 引進以數位形式傳遞的清單,除非呼叫的命令是原生應用程式,在此情況下,它們會解譯為可展開字串的一部分。 不支援初始、連續或尾端逗號。

內嵌表達式的值會轉換成字串。

下表提供表達式模式和自變數模式中處理的數個值範例,以及這些值的評估。 我們假設變數 a 的值是 4

範例 模式 結果
2 運算是 2 (整數)
`2 運算式 “2” (命令)
echo 2 運算式 2 (整數)
2+2 運算式 4 (整數)
echo 2+2 引數 “2+2” (字串)
echo(2+2) 運算式 4 (整數)
$a 運算式 4 (整數)
echo $a 運算式 4 (整數)
$a+2 運算式 6 (整數)
echo $a+2 引數 4+2 (字串)
$- 引數 “$-” (命令)
echo $- 引數 “$-” (字串)
a$a 運算式 “a$a” (命令)
echo a$a 引數 “a4” (字串)
a'$a' 運算式 “a$a” (命令)
echo a'$a' 引數 “a$a” (字串)
a"$a" 運算式 “a$a” (命令)
echo a"$a" 引數 “a4” (字串)
a$(2) 運算式 “a$ (2) ” (命令)
echo a$(2) 引數 “a2” (字串)

每個標記都可以解譯為某種物件類型,例如布爾值或字串。 PowerShell 會嘗試從表達式判斷物件類型。 物件類型取決於命令預期的參數類型,以及 PowerShell 是否知道如何將自變數轉換成正確的類型。 下表顯示指派給表達式所傳回值的數個型別範例。

範例 模式 結果
Write-Output !1 引數 “!1” (字串)
Write-Output (!1) expression False (布爾值)
Write-Output (2) expression 2 (整數)
Set-Variable AB A,B 引數 'A','B' (陣列)
CMD /CECHO A,B 引數 'A,B' (字串)
CMD /CECHO $AB expression 'A','B' (陣列)
CMD /CECHO :$AB 引數 ':A B' (字串)

在 PowerShell 3.0 中引進的停止剖析符號 (--%) ,指示 PowerShell 避免將輸入解譯為 PowerShell 命令或表達式。

在 PowerShell 中呼叫可執行程式時,請將停止剖析符號放在程式自變數之前。 這項技術比使用逸出字元來避免錯誤解譯更為簡單。

遇到停止剖析符號時,PowerShell 會將行中的其餘字元視為常值。 它執行的唯一解譯是取代使用標準 Windows 表示法的環境變數值,例如 %USERPROFILE%

停止剖析符號只有在下一個換行符或管線字元之前才有效。 您無法使用接續字元 (`) 來擴充其效果,或使用命令分隔符來 ; 終止其效果 () 。

例如,下列命令會呼叫 Icacls 程式。

icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

若要在 PowerShell 2.0 中執行此命令,您必須使用逸出字元來防止 PowerShell 錯誤解譯括號。

icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F

從 PowerShell 3.0 開始,您可以使用停止剖析符號。

icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

PowerShell 會將下列命令字串傳送至 Icacls 程式:

X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

注意

停止剖析符號僅適用於 Windows 平臺。

另請參閱

about_Command_Syntax