考虑以下cmd.exe
批处理脚本:
testpar.cmd
@echo [%1] [%2]
如果我们在Powershell中称之为它,这些结果是相当明显的:
PS> .\testpar.cmd arg1 arg2
[arg1] [arg2]
PS> .\testpar.cmd "arg1 arg2"
["arg1 arg2"] []
但是,在传递变量时:
PS> $alist= "arg1 arg2"
PS> .\testpar.cmd $alist
["arg1 arg2"] []
$alist
似乎与引号一起传递。
一个解决方案:
PS> $alist= "`"arg1`" `"arg2`""
PS> .\testpar.cmd $alist
["arg1"] ["arg2"]
标识参数,但不删除引号 另一种可能性:
PS> Invoke-Expression (".\testpar.cmd " + $alist)
[arg1] [arg2]
这很有效,但非常令人费解。有更好的方法吗?
特别是有一种取消引用字符串变量的方法吗?
答案 0 :(得分:1)
我发现了一个类似的问题here
您可以使用逗号:$alist = "a,b"
逗号将被视为一个参数分隔符:
PS D:\temp> $arglist = "a,b"
PS D:\temp> .\testpar.cmd $arglist
[a] [b]
您还可以使用数组传递参数:
PS D:\temp> $arglist = @("a", "c")
PS D:\temp> .\testpar.cmd $arglist
[a] [c]
答案 1 :(得分:0)
传递$alist
的最便捷方式是:
PS> .\testpar.cmd $alist.Split()
[arg1] [arg2]
通过这种方式,我无需改变构建$alist
的方式
除了Split()
之外,对于引用的长参数也很有效:
PS> $alist= @"
>> "long arg1" "long arg2"
>> "@
这是:
PS> echo $alist
"long arg1" "long arg2"
并给出:
PS> .\testpar.cmd $alist.Split()
["long arg1"] ["long arg2"]
答案 2 :(得分:0)
一般情况下,我建议使用数组来建立一个参数列表,而不是将它们全部混合成一个字符串:
$alist = @('long arg1', 'long arg2')
.\testpar.cmd $alist
如果您需要传递更复杂的参数,您可能会发现this answer有用。