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)}
Espero que tenham gostado.