Run a local function on a remote computer?

George Mauer picture George Mauer · Apr 12, 2013 · Viewed 11.9k times · Source

I have a simple function on my computer

MYPC> $txt = "Testy McTesterson"
MYPC> function Do-Stuff($file) { 
  cd c:\temp; 
  $txt > $file; 
}

I would like to run it on a remote computer

MYPC> Invoke-Command -ComputerName OTHERPC { Do-Stuff "test.txt" }

Understandably, Do-Stuff does not exist on OTHERPC and this does not work. How could I get it to work though? The Do-Stuff function abstracts some basic code and is invoked in a few other places so I don't want to duplicate it.

Notice that in my example values are passed into the function both via a parameter and via scope closure. Is that possible?

Answer

dugas picture dugas · Apr 12, 2013

I don't know how you use the closure value, but you can pass both as parameters like so:

$txt = "Testy McTesterson"
$file = "SomeFile.txt"
function Do-Stuff { param($txt,$file) cd c:\temp; $txt > $file }
Invoke-Command -ComputerName SomeComputer -ScriptBlock ${function:Do-Stuff} -ArgumentList $txt, $file