有没有办法拥有可读的SINGLE cmd / powershell脚本?

时间:2015-02-10 07:25:29

标签: powershell cmd

在过去,我记得我们曾经使用过一种技巧来在Windows cmd.exe中运行Perl脚本,作为cmd文件的简单调用,而不是必须运行perl.exe脚本名称,如:

@rem = '
@perl -x -S %0 %*
@goto :eof
@rem ';
<insert Perl script here>

这使用了相当巧妙的技巧来利用cmd.exeperl.exe处理输入脚本的方式的差异。 Windows“cmd.exe会将前三行读作三个独立的命令:

  • 发表评论但没有回音;
  • 使用相同的输入文件和参数运行perl,没有echo;和
  • 转到文件的末尾(退出),没有回声。

另一方面,perl.exe会将前四行视为赋值语句,然后继续执行适当的Perl脚本。

现在从cmd.exe命令行运行Powershell脚本通常很痛苦,因为你必须使用类似的东西:

powershell -file go.ps1

我想知道是否有办法将批量 powershell命令编码到单个cmd文件中,类似于Perl技巧,以这种方式开始cmd.exe下运行,但之后会很快切换到Powershell。

如果可以,只需输入以下内容即可运行脚本go.cmd

go

在命令行,而不是powershell的一些错综复杂的调用。

我知道您可以发送单独的 cmdps1文件,但这实际上是我想要摆脱的内容。如果可能的话,我正在寻找单一文件解决方案。

我也知道您可以对脚本进行base-64编码或将其作为字符串执行,前提是您用分号替换所有换行符。但这意味着Powershell的内容不再容易在结果文件中编辑或读取。

1 个答案:

答案 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管道命令并且没有将它们放在正确的脚本文件中,因此对于更复杂的脚本可能会有些奇怪,如果你开始嵌套这些混合的话,那就更是如此。我不相信这在制作中,但是,嘿,这是一些东西。