我需要构建一个实际上是命令行的字符串,然后执行该命令行的内容。我希望呼叫运算符 (&) 会有所帮助,但似乎没有。这是一个简单的人为例子。以下按预期工作,它 ping 一个网站:
$command = "ping"
$website = "www.bbc.co.uk"
& $command $website
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其更改为:
$command = "ping"
$website = "www.bbc.co.uk"
$cmd = "$command $website"
& $cmd
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
术语“ping www.bbc.co.uk”不被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
有没有办法将命令行动态构建为字符串,然后执行它?
是的,但您需要使用Invoke-Expression(就像eval),而不是调用运算符。请注意,在这种情况下,您还需要确保所有引用都是正确的。例如
$cmd = "'$command' '$website'"
Run Code Online (Sandbox Code Playgroud)
将在您的琐碎示例中工作,除非$command或$website包含单引号。这里的问题本质上是您放入字符串中的所有内容都受 PowerShell 的通常解析规则的约束。
通常,如果可以,请尽可能远离Invoke-Expression。有一些问题需要它,但调用外部程序......不是那么多。
一个更好的选择,尤其是当你有任意数量的参数时,是只收集数组中的参数并使用 splat 运算符(注意@下面的代码示例中的 ):
$command = 'ping'
$arguments = '-t','www.bbc.co.uk'
&$command @arguments
Run Code Online (Sandbox Code Playgroud)
这确保了在必要时通常避免论点是否正确引用了很多,你会得到与头痛Invoke-Expression。
(旁注:每当您在 PowerShell 中遇到问题并认为“哦,我只是要使用字符串”时,通常是时候重新考虑这一点。这包括处理文件名或命令行。PowerShell 有对象,可以减少它早期 shell 的功能只会产生与其他地方相同的痛苦,例如多级转义,有时使用不同的语法等。大多数时候有更好的方法来解决问题。)
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |