使用 PowerShell 呼叫表示式

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. PowerShell 中的 Invoke-Expression
  2. 在 PowerShell 中使用 Invoke-Expression 將引數傳遞給指令碼
  3. Invoke-Expression 與 PowerShell 中呼叫運算子的區別
  4. PowerShell 中 Invoke-CommandInvoke-Expression 的區別
使用 PowerShell 呼叫表示式

Invoke-Expression PowerShell cmdlet 在何時以及何時不使用時很容易被誤解。本文將教我們 Invoke-Expression 是如何工作的,以及我們如何將它付諸實踐。

PowerShell 中的 Invoke-Expression

Invoke-Expression 命令以指令碼塊的形式計算或執行特定字串,並返回命令或表示式的結果。它可以幫助呼叫指令碼中的程式碼,構建稍後執行的命令,或者通過使用者提供的輸入謹慎使用它。

Invoke-Expression 的一個示例是定義一個指令碼並將該字串傳遞給 Command 引數。

指令碼示例:

$getProcess = 'Get-Process'
Invoke-Expression -Command $getProcess

$pathFile = '.\Test.ps1'
Invoke-Expression -Command $pathFile

如果你將路徑項括在雙 "" 或單引號'' 中,並且整個字串用引號引起來,Invoke-Expression 將按預期執行指令碼。你還可以指示指令碼檔案的完整路徑位置,如下例所示。

指令碼示例:

$pathFile = "C:\'Folder Path'\Test.ps1"
Invoke-Expression $pathFile

在 PowerShell 中使用 Invoke-Expression 將引數傳遞給指令碼

沒有使用 Invoke-Expression 傳遞引數的本地方法,但我們可以將它們包含在你提供給 Command 引數的字串中。我們可以通過提供引數將引數傳遞給該指令碼,而不是通過 Invoke-Expression 使用引數。

我們必須將整行包含在一個字串中,然後將該字串傳遞給 Command 引數。

指令碼示例:

$pathFile = 'C:\Scripts\Test.ps1'
$scriptParam = '-Path "C:\file.txt" -Force'
Invoke-Expression "$pathFile $scriptParam"

# or

$pathFile = 'C:\Scripts\Test.ps1 -Path "C:\test_file.txt" -Force'
Invoke-Expression $pathFile

Invoke-Expression 與 PowerShell 中呼叫運算子的區別

呼叫運算子 (&) 用於執行指令碼、指令碼塊或命令,但它不會像 Invoke-Expression 那樣解釋 command 引數。

例如,我們將使用 Get-Process -ProcessName pwsh cmdlet 獲取 PowerShell Core 程序。不幸的是,使用 call 運算子,連線 Get-Process 和引數將不起作用。

指令碼示例:

$getProc = "Get-Process"

## The script below will not work
& "$getProc pwsh"

如果我們使用 Invoke-Expression 執行此字串,該命令將執行,如下所示。

指令碼示例:

Invoke-Expression "$getProc pwsh"

PowerShell 中 Invoke-CommandInvoke-Expression 的區別

Invoke-Expression cmdlet 僅將字串轉換為可執行程式碼。相比之下,Invoke-Command 命令允許我們在遠端或本地計算機上執行程式。

如果我們現在正在編寫執行的命令,則最好使用 Invoke-Command cmdlet,因為我們在 IDE 中保留了 IntelliSense,而如果我們想從當前指令碼中呼叫另一個指令碼,則 Invoke-Expression 會更好。

指令碼示例:

## Invoke-Command
Invoke-Command -ScriptBlock {
    Get-Process PowerShell
}

## Invoke-Expression
Invoke-Expression -Command "
    Get-Process PowerShell
"
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn