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

在PowerShell中使用命令行参数运行可执行文件,powershell,command,execute,Powershell,Command,Execute,这必须是可能的。我能够在windows中打开命令提示符并执行以下操作: <some exe> <some exe command line parameters> 但是如果我在PowerShell中尝试类似的方法 & "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0 它失败并出现一般错误: inva

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

<some exe> <some exe command line parameters>
但是如果我在PowerShell中尝试类似的方法

& "docker" run –-net=kafka -d –-name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:4.1.0
它失败并出现一般错误:

invalid reference format.
也许PowerShell不适合这种类型的高级用例。如有任何建议,将不胜感激

有没有更好的脚本语言可以用于像这样的高级用途?

以下是如何做到这一点

$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

总的来说,PowerShell中的外部程序的调用方式与cmd.exe中的调用方式相同-存在差异,因为PowerShell具有额外的元字符,如$和@,但它们在您的特定情况下不起作用。 你的码头工人。。。variant原则上也可以工作,但只有在必须使用带引号或基于变量的命令名或路径时,才需要使用&

问题是原始命令行包含两个实例,而不是预期的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破折号的代码点,而常规-的代码点为45 0x2d

所需的只是将这些–实例替换为–并且,由于不需要引用docker,因此不需要&:

显示了命令的基于变量的实现,该实现实际上与上面的命令相同-如果所有参数事先已知,则永远不需要使用变量

如果确实要使用变量,则更简单的方法是对所有参数使用单个数组变量并传递:

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

& $dockerExe $dockerArgs
注:

可执行文件名/路径必须始终单独指定,如果它被引用或涉及变量引用(如本例中所述)&,则出于语法原因,必须将用于调用

以这种方式将参数作为数组传递给外部程序;对于PowerShell命令,您需要创建一个哈希表变量,该变量使用sigil@而不是$传递,这是一个称为


我认为Start-Process cmdlet将非常有用。ArgumentList可以是单引号或双引号


启动进程docker-ArgumentList run–-net=kafka-d–-name=zookeeper-e zookeeper\u CLIENT\u PORT=2181 confluentinc/cp zookeeper:4.1.0

powershell转义中存在许多复杂问题。我编写此模块是为了帮助运行外部命令:

演示:


这与docker run-net=kafka-d-name=zookeeper-e zookeeper\u CLIENT\u PORT=2181 confluentinc/cp zookeeper:4.1.0没有什么不同。如果确实需要通过变量提供参数,请声明一个数组$a='run','-net=kafka'。。。并传递docker$a。上面接受的答案演示了如何在powershell中使用参数运行命令。没错,您的答案演示了在powershell中使用参数运行命令的一种方法,但这是一种不必要的复杂方法,因此是不明智的方法-实际上与正常方法相同,我的第一条评论中显示了直接调用,因此它不可能是问题中提出的问题的解决方案。它肯定是一个解决方案,因为第一条评论中的解决方案不起作用,而这一条起作用了:-这是一个解决方案的唯一原因是因为您重新键入了参数,从而消除了问题的真正根源:您原来的命令行意外地使用了2个EN-DASH字符,而不是常规的破折号连字符-请参阅我的答案。您的调用样式是不明智的,与真正的解决方案无关。这并不能解决命令行中包含em破折号而不是连字符的真正问题,但即使这样,它也会从根本上改变调用的行为:默认情况下,Start Process创建一个新窗口并异步运行—对于docker等控制台应用程序的正常同步调用来说,它只是一个错误的工具。顺便说一句:这绝对不是一个高级用例:使用参数调用控制台应用程序是任何shell(包括PowerShell)的核心功能。
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
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")