Powershell - comando “Copy-item” no scriptblock de Invoke-Command

Sep 02 2020

Preciso copiar o arquivo de um servidor remoto para outro usando o script do PowerShell.

O que eu tentei: -

Embora eu use os seguintes comandos do PowerShell, ele funciona bem. (Significa arquivo copiado de um servidor para outro)

Mas, embora eu use o seguinte script, ele apresenta o erro "não foi possível encontrar o caminho ..." da seguinte forma

Na verdade, o arquivo existe nesse caminho.

Eu tentei me referir a seguir stack-overflow já pergunta-resposta

  • Erro com o comando do PowerShell para copiar o arquivo para o servidor remoto com credencial
  • O parâmetro 'Session' é nulo ou vazio no script do PowerShell
  • PowerShell remoto
  • Invoke-Command com sessão remota: Não é possível validar o argumento no parâmetro
  • Não é possível copiar um binário para uma VM remota do Azure
  • Comando do PowerShell para copiar arquivo na máquina remota

Também tentei obter ajuda para usar

 Get-Help Invoke-Command

Pergunta :-

  1. Como posso usar o comando "Copy-Item" dentro de "Invoke-Command (Scriptblock)" no script (2) para copiar o arquivo?
  2. Existe alguma maneira melhor de conseguir isso (significa melhor prática)?

Respostas

T-Me Sep 03 2020 at 19:50

Invoke-Commandpossui o parâmetro -ArgumentListque pode ser utilizado para fornecer os valores das variáveis ​​locais na sessão remota. O problema é: é apenas o VALOR da variável. Nenhum arquivo!

O que você pode fazer:
Use Get-Content -Rawem arquivos pequenos para salvar o contante em uma variável. No sistema de destino, crie um New-Itemcom o -Valuedesse arquivo. No entanto, isso não é muito eficaz.

Exemplo:

$txt = Get-Content -Raw -Path "C:\test\oldFile.txt" $Session = New-PSSession 127.0.0.1
Invoke-Command -Session $Session -ScriptBlock { Param($Txt) New-Item -Path c:\test\newFile.txt -Value $txt } -ArgumentList $txt 
#Get-PSSession | Remove-PSSession

Resultado:

   Verzeichnis: C:\test    # Sry german OS


Mode                LastWriteTime         Length Name                      PSComputerName           
----                -------------         ------ ----                      --------------           
-a----       03.09.2020     12:23         658033 newFile.txt               127.0.0.1  

O que você deve fazer:
acho que o uso de Copy-Item -ToSession $Sessioné a maneira certa de fazer isso. É literalmente feito apenas para o seu propósito. A desvantagem é que o diretório de destino precisa existir. Mas você precisa de uma PSSession para ambos os cmdlets de qualquer maneira. Portanto, você pode usar Invoke-Commandcom a mesma PSSession. Primeiro crie uma PSSession. Use Invoke-Commandpara criar seu diretório. Em seguida, use Copy-Itempara mover o arquivo para o lugar certo. Finalmente, você pode usar Invoke-Commandpara fazer algumas etapas de acabamento. E não se esqueça de Remove-PSSessionquando terminar:

$DestinationPath = "C:\test"
Invoke-Command -Session $Session -ScriptBlock { Param($Destination) New-Item -Path $Destination -ItemType Directory } -ArgumentList $DestinationPath
Copy-Item -Path "C:\test\oldFile.txt" -ToSession $Session -Destination "c:\test\newFile.txt" Invoke-Command -Session $Session -ScriptBlock { write-host "Do some stuff" }
$Session | Remove-PSSession