【问题标题】:Is there a way to have a readable SINGLE cmd/powershell script?有没有办法拥有一个可读的 SINGLE cmd/powershell 脚本?
【发布时间】:2015-02-10 07:25:28
【问题描述】:

在过去,我记得我们用来在 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,无需回显;和
  • 转到文件末尾(退出),没有回显。

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

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

powershell -file go.ps1

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

如果可能的话,您可以运行您的脚本go.cmd,只需输入:

go

在命令行中,而不是对powershell 进行一些复杂的调用。

我知道您可以发送单独 cmdps1 文件,但事实上我正试图摆脱这种情况。如果可能,我正在寻找单文件解决方案。

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

【问题讨论】:

标签: powershell cmd


【解决方案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。

由于我们是通过标准输入管道命令并且没有将它们放在适当的脚本文件中,因此对于更复杂的脚本可能会很奇怪,如果您开始嵌套这些混合体,那就更是如此。在生产中我不相信这个,但是,嘿,它的东西。

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 2020-01-08
    • 2013-01-10
    • 1970-01-01
    • 2021-03-18
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多