回答这个问题,原始请求者想知道
在 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 可用于执行字符串扩展,但如果字符串由最终用户提供,则需要确保它不包含恶意代码/表达式。