Powershell: comando "Copia elemento" nel blocco di script di Invoke-Command

Sep 02 2020

Ho bisogno di copiare il file da un server remoto all'altro utilizzando lo script PowerShell.

Quello che ho provato: -

Anche se uso i seguenti comandi PowerShell, funziona bene (significa che il file è stato copiato da un server all'altro)

Ma mentre uso il seguente script, viene visualizzato l'errore "Impossibile trovare il percorso ..." come segue

In realtà, il file esiste in quel percorso.

Ho provato a fare riferimento al seguente stack-overflow già domanda-risposta

  • Errore con il comando di PowerShell per la copia del file sul server remoto con credenziali
  • Il parametro "Session" è nullo o vuoto nello script di PowerShell
  • remoto PowerShell
  • Invoke-Command con sessione remota: impossibile convalidare l'argomento sul parametro
  • Impossibile copiare un file binario in una macchina virtuale di Azure remota
  • Comando di PowerShell per copiare il file sulla macchina remota

Ho anche cercato di ottenere assistenza nell'utilizzo di

 Get-Help Invoke-Command

Domanda: -

  1. Come posso utilizzare il comando "Copia elemento" all'interno di "Invoke-Command (Scriptblock)" nello script (2) per copiare il file?
  2. C'è un modo migliore per raggiungere questo obiettivo (significa best practice)?

Risposte

T-Me Sep 03 2020 at 19:50

Invoke-Commandha il parametro -ArgumentListche può essere utilizzato per fornire i valori delle variabili locali nella sessione remota. Il problema è: è solo il VALORE della variabile. Nessun file!

Cosa puoi fare:
usa Get-Content -Rawsu piccoli file per salvare il contenuto in una variabile. Sul sistema di destinazione creare un New-Itemcon il -Valuedi quel file. Tuttavia questo non è molto efficiente.

Esempio:

$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

Risultato:

   Verzeichnis: C:\test    # Sry german OS


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

Cosa dovresti fare:
penso che il tuo uso di Copy-Item -ToSession $Sessionsia il modo giusto per farlo. È letteralmente fatto apposta per il tuo scopo. Lo svantaggio è che la directory di destinazione deve esistere. Tuttavia, è comunque necessaria una PSSession per entrambi i cmdlet. Quindi puoi usare Invoke-Commandcon lo stesso PSSession. Prima crea una PSSession. Usa Invoke-Commandper creare la tua directory. Quindi utilizzare Copy-Itemper spostare il file nel posto giusto. Infine puoi usare Invoke-Commandper eseguire alcuni passaggi di finitura. E non dimenticare di Remove-PSSessionquando hai finito:

$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