Don’t Do This: PSExec’ing a Batch Script Containing a PowerShell Script


This is just broken, but  broken times call for broken measures.  I’m stuck on PSH V1 for reasons best left unmentioned (or maybe it’s unmentionable reasons.)  To run remote commands, I don’t have remoting at my disposal – I’m stuck with SysInternal’s PSExec.exe.

As shown in Lee Holmes’ blog,  you have to perform some hackosity to run a script remotely:

\\path\to\psexec.exe \\computerName cmd /c “echo . | powershell \\path\to\script.ps1”

This means you can’t use PSExec.exe’s -c option to copy the file over, so you have to manually copy the script over.

Here’s my ‘solution’ (to use the term exceptionally loosely):


echo @”
@echo off && copy /y %~f0 %~f0.ps1 >NUL 2>&1
echo . | powershell -nologo -noprofile %~f0.ps1 %*
del /f /q %0.ps1 >NUL 2>&1 && exit /b 0
“@ | out-null;
$args = [Environment]::GetCommandLineArgs();
$scriptName = $args[3];
$args = $args[4..($args.Count – 1)];

“rest of script goes here”
$scriptname
$args


Yeah.  Hack-n-slash scripting.

 


Comments (2)

  1. timid says:

    Oh, and there's a PSH V2 way that's much cleaner from http://poshcode.org/2447

    :: <#

    copy %0 %0.ps1

    PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; . %0.ps1; Remove-Item %0.ps1"

    exit

    :: #>

    $ErrorActionPreference = 'Continue'

    ### Your PowerShell script goes below here.

    ### I've put a couple of lines as an example …

    ls | sort length -desc | select -first 5 | ft

    ps | sort ws -desc | select -first 10 | ft

  2. Lika says:

    Yep!! It worked!! I'm ridiculously greatful.

    Goal: My goal was to deploy my ps via sccm. I kept getting errors.

    Solution: Exactly what you stated…

    Place the following above the ps and change to cmd…and deploy cmd

    :: <#

    copy %0 %0.ps1

    PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; . %0.ps1; Remove-Item %0.ps1"

    exit

    :: #>

    $ErrorActionPreference = 'Continue'