我需要构建一个实际上是命令行的字符串,然后执行该命令行的内容。我希望呼叫运营商(&)可以提供帮助,但似乎没有。这是一个简单的人为例子。以下工作如预期,它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,函数,脚本文件或可操作程序。
有没有办法动态地将命令行构建为字符串,然后执行它?
答案 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的功能只会产生你在其他地方也有同样的痛苦,例如多级转义,有时候有不同的语法等等。大多数时候有更好的解决方法问题。)