Powershell - Befehl "Copy-item" im Skriptblock von Invoke-Command

Sep 02 2020

Ich muss die Datei mithilfe eines Powershell-Skripts von einem Remote-Server auf einen anderen kopieren.

Was ich versucht habe: -

Während ich die folgenden Powershell-Befehle verwende, funktioniert es einwandfrei (bedeutet, dass die Datei von einem Server auf einen anderen kopiert wurde).

Aber während ich folgendes Skript benutze, gibt es Fehler wie "Pfad kann nicht finden ..." wie folgt

Tatsächlich ist eine Datei unter diesem Pfad vorhanden.

Ich habe versucht, auf folgenden Stapelüberlauf bereits Frage-Antwort zu verweisen

  • Fehler mit dem PowerShell-Befehl zum Kopieren der Datei auf den Remoteserver mit Anmeldeinformationen
  • Der Parameter 'Sitzung' ist im PowerShell-Skript null oder leer
  • Powershell-Fernbedienung
  • Invoke-Befehl mit Remote-Sitzung: Argument für Parameter kann nicht überprüft werden
  • Eine Binärdatei kann nicht auf eine Remote-Azure-VM kopiert werden
  • PowerShell-Befehl zum Kopieren von Dateien auf Remotecomputern

Ich habe auch versucht, Hilfe bei der Verwendung zu bekommen

 Get-Help Invoke-Command

Frage: -

  1. Wie kann ich den Befehl "Copy-Item" in "Invoke-Command (Scriptblock)" in Skript (2) verwenden, um eine Datei zu kopieren?
  2. Gibt es einen besseren Weg, um dies zu erreichen (bedeutet Best Practice)?

Antworten

T-Me Sep 03 2020 at 19:50

Invoke-Commandhat den Parameter -ArgumentList, mit dem die Werte lokaler Variablen in der Remote-Sitzung angegeben werden können. Das Problem ist: Es ist nur der Wert der Variablen. Keine Datei!

Was Sie tun können:
Verwenden Sie dieseGet-Content -Raw Option für kleine Dateien, um den Contant in einer Variablen zu speichern. Erstellen Sie auf dem Zielsystem eine New-Itemmit der -Valuedieser Datei. Das ist jedoch nicht sehr effizient.

Beispiel:

$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

Ergebnis:

   Verzeichnis: C:\test    # Sry german OS


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

Was Sie tun sollten:
Ich denke, Ihre Verwendung Copy-Item -ToSession $Sessionist der richtige Weg , dies zu tun. Es ist nur für Ihren Zweck gemacht. Der Nachteil ist, dass das Zielverzeichnis vorhanden sein muss. Sie benötigen jedoch trotzdem eine PSSession für beide Cmdlets. Sie können also Invoke-Commandmit derselben PSSession arbeiten. Erstellen Sie zuerst eine PSSession. Verwenden Invoke-CommandSie diese Option , um Ihr Verzeichnis zu erstellen. Dann nutzen Sie Copy-ItemIhre Datei an die richtige Stelle zu bewegen. Schließlich können Invoke-CommandSie einige Endbearbeitungsschritte ausführen. Und vergessen Remove-PSSessionSie nicht, wenn Sie fertig sind:

$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