在过去,我记得我们曾经使用过一种技巧来在Windows cmd.exe
中运行Perl脚本,作为cmd
文件的简单调用,而不是必须运行perl.exe
脚本名称,如:
@rem = '
@perl -x -S %0 %*
@goto :eof
@rem ';
<insert Perl script here>
这使用了相当巧妙的技巧来利用cmd.exe
和perl.exe
处理输入脚本的方式的差异。 Windows“cmd.exe
会将前三行读作三个独立的命令:
另一方面,perl.exe
会将前四行视为赋值语句,然后继续执行适当的Perl脚本。
现在从cmd.exe
命令行运行Powershell脚本通常很痛苦,因为你必须使用类似的东西:
powershell -file go.ps1
我想知道是否有办法将批量和 powershell命令编码到单个cmd
文件中,类似于Perl技巧,以这种方式开始在cmd.exe
下运行,但之后会很快切换到Powershell。
如果可以,只需输入以下内容即可运行脚本go.cmd
go
在命令行,而不是powershell
的一些错综复杂的调用。
我知道您可以发送单独的 cmd
和ps1
文件,但这实际上是我想要摆脱的内容。如果可能的话,我正在寻找单一文件解决方案。
我也知道您可以对脚本进行base-64编码或将其作为字符串执行,前提是您用分号替换所有换行符。但这意味着Powershell的内容不再容易在结果文件中编辑或读取。
答案 0 :(得分:1)
幸运或其他方面,Powershell确切知道如何处理.cmd
文件:使用CMD来运行它们。
@set $a=%0 && powershell -encodedcommand ZwBjACAAKAAoAGQAaQByACAAZQBuAHYAOgBgACQAYQApAC4AdgBhAGwAdQBlACAALQByAGUAcABsAGEAYwBlACAAJwAiACcALAAnACcAKQAgAHwAIABzAGUAbABlAGMAdAAgAC0AcwBrAGkAcAAgADIAIAB8ACAAcABvAHcAZQByAHMAaABlAGwAbAAgAC0A
@exit /b
"Hello from Powershell! You know it's me because cmd would never know that 2 + 2 = $(2 + 2)!"
编码的命令是
gc ((dir env:`$a).value -replace '\"','') | select -skip 2 | powershell -
获取调用自身的脚本内容,跳过用于CMD的内容,是的,在其余部分运行Powershell。
由于我们通过stdin管道命令并且没有将它们放在正确的脚本文件中,因此对于更复杂的脚本可能会有些奇怪,如果你开始嵌套这些混合的话,那就更是如此。我不相信这在制作中,但是,嘿,这是一些东西。