PowerShell 变量表达式解释器

PowerShell 变量表达式解释器

回答这个问题,原始请求者想知道

在 PowerShell 中,是否有一种方法,在输入长命令或复杂命令后,将该命令提交到历史缓冲区,但不执行它?

然而,我的解决方案纯粹是为了好玩,但我想知道它在后端是如何/为什么起作用的。

回答

$VariableName = "Windows Command"

然后,执行:

Invoke-Expression "$VariableName"

Ping 的示例:

在此处输入图片描述

我还可以以完全相同的方式使用 PowerShell 表达式:

PS H:> $Outlooks = “获取进程-名称 Outlook -Verbose | fl StartTime,线程”
PS H:> Invoke-Expression “$Outlooks”

我的理论

本质上,我相信正在发生的事情是我们正在为第一个变量创建一个字符串(它看起来就是这样,很直接),然后当我们在“”里面调用我们的变量时,它会强制解释器扩展该变量,从而导致它调用正确的命令。

我对此的理解准确吗?最好有参考文献。

答案1

是的,这似乎正是正在发生的事情(顺便说一句,调用时甚至不需要在命令字符串周围加上引号)。

根据帮助说明cmdlet 的(通过 获取get-help Invoke-Expression -full):

iex [-Command] <String> [<CommonParameters>]
Invoke-Expression [-Command] <String> [<CommonParameters>]

Invoke-Expression cmdlet 将评估或运行指定的字符串作为命令,并返回表达式或命令的结果。如果没有 Invoke-Expression,在命令行提交的字符串将不加改变地返回(回显)。

表达式是一种可以评估并产生结果的语句,例如 Windows PowerShell 命令。

如果存储在字符串变量中的命令不太复杂,你也可以使用调用运算符 (&)如下:

& $string

更多详细信息请见这一页

如果表达式的结果为空数组,则invoke-expression将输出$null

Invoke-Expression 可用于执行字符串扩展,但如果字符串由最终用户提供,则需要确保它不包含恶意代码/表达式。

相关内容