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

时间:2019-05-10 00:59:05

标签: powershell command execute

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

@dataclass
class Bar:
    foo: int
    def as_frozen(self):
        return FrozenBar(self.foo)

@dataclass(frozen=True)
class FrozenBar:
    foo: int
    def as_unfrozen(self):
        return Bar(self.foo)

在PowerShell甚至是标准Windows批处理文件中,都必须有等效的方法来执行此操作。例如,从Windows命令提示符下,我可以使用以下命令启动Docker容器:

<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

失败并出现一般错误:

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

也许PowerShell不适合此类高级用例。任何建议将不胜感激!

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

4 个答案:

答案 0 :(得分: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,一个破折号的代码点,而常规-的代码点是450x2d)。

所需要做的就是用替换这些-实例(并且由于不需要引用docker,所以不需要&):

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

Your own answer显示了命令的基于变量的实现,该实现与上述命令有效 -如果预先知道所有参数,则永远不会有需要使用变量。

如果您确实想使用变量,则对所有参数使用单个数组变量并传递该变量要简单得多。

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

& $dockerExe $dockerArgs

注意:

  • 可执行文件名称/路径必须始终单独指定,并且如果被引用或涉及变量引用(在这种情况下),{{1 }},出于语法原因,必须将call operator用于调用。

  • 以这种方式将参数作为数组传递给 external 程序;对于PowerShell命令,您将创建一个 hashtable 变量,并使用标记&而不是@传递,该变量称为splatting

答案 1 :(得分:0)

我认为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"

答案 2 :(得分: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")

答案 3 :(得分:-1)

这是操作方法。

$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