构建一个要传递给调用操作符的字符串

时间:2015-02-11 11:25:00

标签: powershell

我需要构建一个实际上是命令行的字符串,然后执行该命令行的内容。我希望呼叫运营商(&)可以提供帮助,但似乎没有。这是一个简单的人为例子。以下工作如预期,它ping网站:

$command = "ping"
$website = "www.bbc.co.uk"
& $command $website

但是,如果我将其更改为:

$command = "ping"
$website = "www.bbc.co.uk"
$cmd = "$command $website"
& $cmd

我收到错误:

  

“ping www.bbc.co.uk”一词不被视为a的名称   cmdlet,函数,脚本文件或可操作程序。

有没有办法动态地将命令行构建为字符串,然后执行它?

1 个答案:

答案 0 :(得分:4)

是的,但您需要使用Invoke-Expression(就像eval)而不是呼叫运算符。请注意,在这种情况下,您还需要确保所有引用都是正确的。 E.g。

$cmd = "'$command' '$website'"
除非$command$website包含单引号,否则

将适用于您的简单示例。这里的问题基本上是你放入字符串的所有内容都遵循PowerShell的常规解析规则。

一般情况下,如果可以的话,请尽可能远离Invoke-Expression。有一些问题需要它,但是调用外部程序......不是那么多。

一个更好的选择,特别是如果你有任意数量的参数,只是收集数组中的参数并使用splat运算符(请注意下面代码示例中的@):

$command = 'ping'
$arguments = '-t','www.bbc.co.uk'
&$command @arguments

这可以确保在必要时正确引用参数,并且通常可以避免使用Invoke-Expression来解决很多的麻烦。

(旁注:每当你在PowerShell中遇到问题而想到»哦,我只是要使用字符串«,通常是时候重新考虑一下了。这包括处理文件名, PowerShell有对象,将它减少到早期shell的功能只会产生你在其他地方也有同样的痛苦,例如多级转义,有时候有不同的语法等等。大多数时候有更好的解决方法问题。)