[英]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
,連接划線的碼點,而常規的代碼點-
是45
( 0x2d
)。
所有需要的是取代這些–
與實例-
和,因為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
注意:
我認為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.