PowerShell - Como copiar um arquivo de local para máquinas remotas

Durante um treinamento, um aluno me perguntou como copiar um arquivo de uma máquina local para máquinas remotas sem usar um fileshare. Eu achei essa uma ótima pergunta e resolvi compartilhar aqui com vocês.

Eu vou criar um arquivo texto para ser usado como exemplo. O conteúdo do arquivo terá o nome da máquina local.

New-Item -Path C:\temp\localfile.txt -Value $env:ComputerName

O comando  para copiar um arquivo localmente é o:

Copy-Item -Path c:\processos.txt -Destionation c:\temp\processos.txt

Agora imagine que eu queira copiar esse arquivo para outros servidores. A partir do PowerShell 5.0, o comando Copy-Item dá suporte para a cópia de arquivos de uma máquina para outra através dos parâmetros -ToSession e -FromSession. Como o nome sugere, o parâmetro -ToSession espera uma sessão com o computador de destino. Para criar a sessão, eu utilizei o seguinte comando:

$session = new-PSSession -ComputerName PowerShellAzureMachine -Credential $cred

Agora que temos a sessão, o segundo passo é realizar a cópia do arquivo através do parâmetro -ToSession:

Copy-Item -Path C:\temp\localfile.txt -Destination C:\localfile.txt -ToSession $session

Para as versões anteriores do PowerShell, uma das formas de se fazer isso é através do comando Invoke-Command.

O primeiro passo é realizar a leitura do arquivo local para uma variável local:

$file = [System.IO.File]::ReadAllBytes("C:\temp\localfile.txt")

 

Agora eu utilizo o Invoke-Command para executar a copia:

Invoke-Command -Session $session -ArgumentList $file -ScriptBlock {[System.IO.File]::WriteAllBytes("C:\localfile2.txt",$args)}

copyitem

Espero que tenham gostado.