One question we often get around PowerShell Remoting is "How do I collect the output of remoting commands into a different file for each computer?" For example, you want to invoke a remote command across 1,000 machines as a multi-threaded job and then create 1,000 text files for their output.
This is in fact impressively easy in PowerShell due to the automatic properties that we add to remote output. The trick is to just know that it exists 🙂
106 [C:\windows\system32] >> Invoke-Command myComputer { "Hello World" } Hello World 107 [C:\windows\system32] >> Invoke-Command myComputer { "Hello World" } | Format-List * -Force PSComputerName : myComputer RunspaceId : 30c313ff-00a2-4a21-a001-1309c5d12a1d PSShowComputerName : True Length : 11
As you can see in the example, we tag remote output with the computer name from which it originated. If we leverage that property, we can now create output files for remote output quite easily:
130 [C:\windows\system32] >> $job = Invoke-Command comp1,comp2 {
"Hello World: from $(hostname): $(Get-Random)" } -AsJob 131 [C:\windows\system32] >> Wait-Job $job 132 [C:\windows\system32] >> $r = Receive-Job $job 133 [C:\windows\system32] >> $r Hello World: from comp1: 341068382 Hello World: from comp2: 1357111073 134 [C:\windows\system32] >> $r.PSComputerName comp1 comp2 135 [C:\windows\system32] >> $r | % { $_ > c:\temp\$($_.PSComputerName).output } 136 [C:\windows\system32] >> dir c:\temp\*.output Directory: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 4/16/2014 11:04 AM 88 comp1.output -a--- 4/16/2014 11:04 AM 82 comp2.output
Lee Holmes [MSFT]
Windows PowerShell Development
0 comments