Invoke运算符(&)与Invoke-Expression为何对同一输入产生不同结果?
Invoke运算符(&)与Invoke-Expression(IEX)的行为差异
我之前一直觉得PowerShell里的Invoke运算符&和Invoke-Expression(常用别名IEX)行为应该差不多,但实际测试后才发现两者的表现完全不一样,看下面的实际执行例子:
用Invoke运算符(&)执行的结果
PS C:\Users\admin> powershell -Command "& {\"\"([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('ZWNobyAnaGVsbG93b3JsZCc=')))\"\"}" echo 'helloworld'
这里执行后,只是把Base64解码后的命令文本echo 'helloworld'输出了出来,并没有真正执行这条echo命令。
用Invoke-Expression(IEX)执行的结果
PS C:\Users\admin> powershell -Command "IEX \"\"([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('ZWNobyAnaGVsbG93b3JsZCc=')))\"\"" helloworld
而换成IEX之后,解码得到的echo 'helloworld'会被直接当作PowerShell代码执行,最终输出了我们想要的helloworld结果。
核心区别
&运算符的作用是调用脚本块、命令或者可执行文件,它不会把字符串内容当作代码解析执行——这里脚本块里的内容是一个字符串运算的结果,所以只会输出这个字符串。Invoke-Expression的核心功能就是将字符串解析为PowerShell代码并执行,所以它会直接运行解码后的命令内容。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

