Search code examples
powershellpowershell-remoting

Trouble Executing a .cmd file during a PS-Session


Im trying to execute a .bat file remotely in a powershell script. The code in my script file looks something like this:

$server
$cred
# Both of these methods are strings pointing to the location of the scripts on the
# remote server ie. C:\Scripts\remoteMethod.cmd
$method1
$method2
$scriptArg

Enter-PSSession $server -Credential $cred
Invoke-Command {&$method1}
if($?)
{
    Invoke-Command {&$method2 $args} -ArgumentList $scriptArg
}
Exit-PSSession

But whenever I run it I get

The term 'C:\Scripts\remoteMethod.cmd' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

This happens even if i switch around the order the methods are called in.

I found this question Using Powershell's Invoke-Command to call a batch file with arguments and have tried the accepted answers to no avail.


Solution

  • I wouldn't have expected the $method1 and $method2 variables to be available inside the scriptblock for Invoke-Command. Usually you would have to pass those in via the -ArgumentList parameter e.g.:

    Invoke-Command {param($method, $arg) &$method $arg} -Arg $method2 $scriptArg
    

    But it seems in your case the path to the CMD file is making it across the remote connection. Try this to see if the problem is related to a modified ComSpec environment variable on the remote machine:

    Invoke-Command {param($method, $arg) cmd.exe /c $method $arg} -Arg $method2, $scriptArg