我需要从PowerShell执行一个字符串形式的外部命令。
是否可以通过dot-sourcing或类似的方式运行带有参数的外部命令(本例中为ping)?
或者你必须使用Invoke-Expression?
# This works:
$commandText = "ping"
. "$commandText"
# This results in: The term 'ping -t 127.0.0.1' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
$commandText = "ping -t 127.0.0.1"
. "$commandText"
我试过&并引用了参数,但没有任何效果。
3条答案
按热度按时间zpjtge221#
如果你 * 给定 * 一个字符串代表 * 整个命令行*-即一个包含可执行文件名/路径 * 及其参数 * 的字符串,你确实不能 * 使用
.
,点源操作符,也不能使用&
,调用操作符,因为这些操作符只接受可执行文件的 * 名称或路径 * 作为它们的第一个参数,而可执行文件的 * 参数 * 需要 * 单独 * 指定。ping
),.
的行为与&
相同-仅对于 *PowerShell脚本 * 或 * 脚本块 ,这些运算符的行为不同:.
直接在调用者的作用域 * 中运行脚本(块),&
-更常见的情况是-在 * 子 * 作用域中运行它。还要注意的是,使用
&
来调用脚本和外部程序,其名称/路径既不带引号,也不通过变量表示,这是 * 可选的 *。Invoke-Expression
(iex
)-其中should generally be avoided-是最简单的解决方案,但通常的警告适用:Invoke-Expression
允许执行存储在字符串中的任意代码,请确保您“完全控制”或“隐式信任”字符串的内容。或者,您可以创建一个script block
{ ... }
,然后使用&
按需调用-但请注意,这涉及与使用Invoke-Expression
相同的风险:Invoke-Expression
稍微更有效,尽管这在实践中可能并不重要。@args
是自动$args
变量的splatted form);例如:如果命令行是为 * 其他shell / 非shell * 调用编写的:**
为
cmd.exe
和无shell调用上下文(如计划任务)编写的命令行 * 在由PowerShell直接执行时可能有效,也可能无效,这取决于特定的命令,这是由于PowerShell的参数语法不同。值得注意的是,PowerShell有 * 更多 * metacharacters需要引用或转义,如
@
,(
,)
和{
,}
,其转义字符(```,所谓的反勾号)是不同的(cmd.exe
使用^
)。在这种情况下,最简单的方法是将命令行传递给
cmd.exe
CLI,使用其**/c
**参数:注意事项:
/bin/sh -c $commandText
。lnlaulya2#
将参数放入数组中:
输出:
py49o6xq3#
将命令放入脚本块中,并将其转换为脚本块。这可以通过调用操作符&来调用。具体如下: