在 PowerShell 中使用命令行参数运行可执行文件



这必须是可能的。 我能够在窗口中打开命令提示符并执行以下操作:

<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不适合这种类型的高级用例。 任何建议将不胜感激!

对于这样的高级用法,有没有更好的脚本语言?

我认为启动进程cmdlet会很有用。参数列表可以是单引号或双引号。

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

总的来说,PowerShell 中的外部程序的调用方式与cmd.exe中的调用方式相同 - 由于 PowerShell 具有额外的元字符(如$@),因此存在差异,但它们在您的特定情况下不会发挥作用。 (您的& "docker" ...变体原则上也可以工作,但仅当您必须使用带引号基于变量的命令名称或路径时,才需要使用&)。

问题是您的原始命令行包含两个实例(EN DASH,U+2013),而不是预期的 ASCII 范围-破折号(连字符),docker无法识别。

发现问题的快速方法:

# 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,en-dash 的代码点,而常规-的代码点是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

注意:

  • 可执行文件名称/路径必须始终单独指定,如果它被引号或涉及变量引用(如本例所示),&,出于语法原因,必须使用调用运算符进行调用。

  • 以这种方式将参数作为数组传递适用于外部程序;对于PowerShell命令,您将创建一个哈希表变量,该变量使用符号@而不是$传递,该功能称为splatting

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

最新更新