簡體   English   中英

將可變字符串命令傳遞給 powershell -Command

[英]Pass variable string command to powershell -Command

我需要運行這個從另一個腳本讀取的命令。

$command = "$arr = @($input)
$arr.count
Write-Host $arr[0]"

"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {$command}

所以我通過 pipe 得到了一些東西,然后我在我的字符串命令中使用它。 該代碼不起作用,因為$command未擴展為調用中的字符串,因此在啟動的 powershell 命令中未知。

這些按預期工作,但命令不是從字符串中獲取的:

"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {Invoke-Expression "Write-Host $input"}

# No:   System.Management.Automation.Runspaces.PipelineReader`1+<GetReadEnumerator>d__20[System.Object]
# "Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {Write-Host $input}

"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {$arr = @($input)
    $arr.count
    Write-Host $arr[0]}
  • { $command }不會將字符串$command的值轉換為腳本塊- 它只是創建一個引用名為$command的變量的腳本塊。

  • 另外,不要通過cmd /c調用powershell.exe - 通常沒有必要。

所以:

$command = '$arr = @($input)
$arr.count
Write-Host $arr[0]'

"Classical Music for When You are on a Deadline." | 
  powershell ([scriptblock]::Create($command))  # -Command is implied.

筆記:

  • 以上是您問題中最后一次解決方案嘗試的動態的、基於變量的等價物。

  • 在 PowerShell 的 CLI 中使用腳本塊而不是字符串——這只是 PowerShell內部的一個選項——通常更可取,原因如下:

    • 提供有限的類型保真度,使用與后台作業和遠程處理相同的基於 XML 的序列化基礎結構; 也就是說,您可以從這樣的 CLI 調用中返回字符串以外的對象; 同樣,此類調用會保留 PowerShell 的所有output 流

    • Base64 編碼在幕后用於將腳本塊的源代碼安全地傳遞給目標 PowerShell 進程,從而繞過任何引用和 escaping 令人頭疼的問題。

      • 值得注意的是,由於高達 PowerShell 7.2.x 的一個長期存在的錯誤,將命令作為字符串傳遞需要嵌入的"字符手動轉義為\" - 請參閱此答案

換句話說:雖然powershell -Command $command可以使用特定的示例字符串,但如果字符串包含"字符,它將失敗,總是在 Windows PowerShell 中,並且至少達到 PowerShell(核心)7.2.x。


退一步說:既然你已經在 PowerShell 中運行了,就沒有必要再創建一個實例作為子進程了,這是很昂貴的。

$command = '$arr = @($input)
$arr.count
Write-Host $arr[0]'

# Invoke the dynamically created script block directly.
"Classical Music for When You are on a Deadline." | 
  & ([scriptblock]::Create($command))

筆記:

  • &調用運算符用於調用腳本塊,該腳本塊在scope 中運行。

    • 如果您希望腳本塊直接在調用者的 scope 中運行,請使用. ,取而代之的是點源運算符
  • Invoke-Expression ( iex ) -通常應該避免- 在這里無論如何都不是一個選項,因為它不支持使用管道將數據傳遞給正在評估的代碼。

您可以使用 Invoke-Expression cmdlet 在 PowerShell 中將變量字符串作為命令運行。例如: Invoke-Expression $commandString

暫無
暫無

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

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