簡體   English   中英

在PowerShell中使用命令行參數運行可執行文件

[英]Running executable with command line parameters in PowerShell

這必須是可能的。 我能夠在Windows中打開命令提示符並執行以下操作:

<some exe> <some exe command line parameters>

在PowerShell甚至是標准Windows批處理文件中,都必須有等效的方法來執行此操作。 例如,從Windows命令提示符下,我可以使用以下命令啟動Docker容器:

docker run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0

但是,如果我嘗試使用PowerShell這樣的操作

& "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0

它失敗並出現一般錯誤:

invalid reference format.

PowerShell可能不適合此類高級用例。 任何建議,將不勝感激!

對於這樣的高級用法,是否有更好的腳本語言?

總體而言,PowerShell中的外部程序的調用方式與cmd.exe中的調用方式相同-有所不同,這是由於PowerShell具有其他元字符(例如$@ ,但在您的特定情況下它們不起作用。 (您的& "docker" ...變體原則上也可以使用,但是僅在必須使用帶引號基於變量的命令名稱或路徑時才需要使用& )。

問題是您的原始命令行包含兩個實例EN DASH, U+2013 ),而不是 docker無法識別的預期ASCII范圍-破折號(連字符)

快速發現問題的方法:

# Print the code points of characters outside the ASCII range.
PS> [int[]] [char[]] '& "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0' -gt 127
8211
8211

十進制8211為十六進制。 0x2013 ,連接划線的碼點,而常規的代碼點-450x2d )。

所有需要的是取代這些與實例-和,因為docker不需要被引用,就沒有必要對& ):

docker run --net=kafka -d --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0

您自己的答案顯示了命令的基於變量的實現,該實現與上面的命令實際上相同 -如果預先知道所有參數,則永遠不需要使用變量。

如果確實要使用變量,則對所有參數使用單個數組變量並傳遞該變量要簡單得多:

$dockerExe =  'docker'
$dockerArgs = 'run',
              '--net=kafka',
              '-d',
              '--name=zookeeper',
              '-e',
              'ZOOKEEPER_CLIENT_PORT=2181',
              'confluentinc/cp-zookeeper:4.1.0'

& $dockerExe $dockerArgs

注意:

  • 可執行文件的名稱/路徑必須始終單獨指定,並且如果用引號引起來或涉及變量引用 (如本例中的& ,則出於語法原因,必須將調用運算符用於調用。

  • 這種方式將參數作為數組傳遞給外部程序。 對於PowerShell命令,您將創建一個哈希表變量,並使用sigil @而不是$傳遞,該功能稱為splatting

我認為Start-Process cmdlet將很有用。 ArgumentList可以單引號或雙引號。

Start-Process docker -ArgumentList "run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0"

Powershell轉義有很多復雜性。 我寫了這個模塊來幫助運行外部命令:

https://github.com/choovick/ps-invoke-externalcommand

演示: https : //terminalizer.com/view/49acb54a979

Install-Module -Name ExternalCommand -Scope CurrentUser
Invoke-ExternalCommand -Command "docker" -Arguments @("run","-d","--name=zookeeper","--net=kafka","-e","ZOOKEEPER_CLIENT_PORT=2181", "confluentinc/cp-zookeeper:4.1.0")

這是操作方法。

$app = 'docker'

$a1 = 'run'

$a2 = '--net=kafka'

$a3 = '-d'

$a4 = '--name=zookeeper'

$a5 = '-e'

$a6 = 'ZOOKEEPER_CLIENT_PORT=2181'

$a7 = 'confluentinc/cp-zookeeper:4.1.0'

& $app $a1 $a2 $a3 $a4 $a5 $a6 $a7

暫無
暫無

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

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