Powershell - comando “Copy-item” no scriptblock de Invoke-Command
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 :-
- Como posso usar o comando "Copy-Item" dentro de "Invoke-Command (Scriptblock)" no script (2) para copiar o arquivo?
- Existe alguma maneira melhor de conseguir isso (significa melhor prática)?
Respostas
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