Powershell:调用外部命令时取消引用参数

时间:2014-10-14 09:44:34

标签: powershell parameter-passing command-line-arguments

考虑以下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]                                              

这很有效,但非常令人费解。有更好的方法吗?
特别是有一种取消引用字符串变量的方法吗?

3 个答案:

答案 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有用。