In olden days, I remember a trick we used to use to run Perl scripts within Windows cmd.exe
as a simple invocation of a cmd
file rather than having to run perl.exe
with the script name, something like:
@rem = '
@perl -x -S %0 %*
@goto :eof
@rem ';
<insert Perl script here>
This used the rather neat trick of exploiting differences in how cmd.exe
and perl.exe
would handle the input script. Windows' cmd.exe
would read the first three lines as three separate commands which would:
- have a comment with no echo;
- run perl with the same input file and arguments, without echo; and
- goto the end of the file (exit) with no echo.
On the other hand, perl.exe
would treat the first four lines as an assignment statement, then go on to execute the Perl script proper.
Now it's often a pain to run Powershell scripts from the cmd.exe
command line since you have to use something like:
powershell -file go.ps1
I'm wondering if there's a way to encode both batch and powershell commands into a single cmd
file, similar to the Perl trick, in such a way that it starts running under cmd.exe
but switches to Powershell quickly after that.
If that were possible, you could run your script go.cmd
simply by entering:
go
at the command line, rather than some convoluted invocation of powershell
.
I know that you can ship separate cmd
and ps1
files but that's in fact what I'm trying to get away from. I'm looking for a single file solution if possible.
I also know that you can base-64 encode your script or execute it as a string, provided you replace all newlines with semicolons. But that means the Powershell stuff is no longer easily editable or readable in the resulting file.