这必须是可能的。我能够在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不适合此类高级用例。任何建议将不胜感激!
对于这样的高级用法,是否有更好的脚本语言?
答案 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
,一个破折号的代码点,而常规-
的代码点是45
(0x2d
)。
所需要做的就是用–
替换这些-
实例(并且由于不需要引用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