Powershell: comando "Copia elemento" nel blocco di script di Invoke-Command
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: -
- Come posso utilizzare il comando "Copia elemento" all'interno di "Invoke-Command (Scriptblock)" nello script (2) per copiare il file?
- C'è un modo migliore per raggiungere questo obiettivo (significa best practice)?
Risposte
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