Powershell - Befehl "Copy-item" im Skriptblock von Invoke-Command
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: -
- Wie kann ich den Befehl "Copy-Item" in "Invoke-Command (Scriptblock)" in Skript (2) verwenden, um eine Datei zu kopieren?
- Gibt es einen besseren Weg, um dies zu erreichen (bedeutet Best Practice)?
Antworten
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