Powershell - polecenie „Kopiuj element” w bloku skryptu Invoke-Command
Muszę skopiować plik z jednego zdalnego serwera na inny za pomocą skryptu PowerShell.
Co próbowałem: -
Podczas gdy używam następujących poleceń PowerShell, działa dobrze. (Oznacza plik skopiowany z jednego serwera na drugi)
Ale gdy używam następującego skryptu, wyświetla błąd „nie można znaleźć ścieżki ...” w następujący sposób
W rzeczywistości plik istnieje w tej ścieżce.
Próbowałem odnieść się po przepełnieniu stosu już na pytanie-odpowiedź
- Błąd z poleceniem PowerShell do kopiowania pliku na serwer zdalny z poświadczeniami
- Parametr „Sesja” ma wartość null lub jest pusty w skrypcie programu PowerShell
- pilot PowerShell
- Wywołaj polecenie z sesją zdalną: Nie można sprawdzić poprawności argumentu parametru
- Nie można skopiować pliku binarnego na zdalną maszynę wirtualną platformy Azure
- Polecenie programu PowerShell do kopiowania pliku na komputerze zdalnym
Próbowałem też uzyskać pomoc przy używaniu
Get-Help Invoke-Command
Pytanie: -
- Jak mogę użyć polecenia „Copy-Item” w „Invoke-Command (Scriptblock)” w skrypcie (2), aby skopiować plik?
- Czy jest lepszy sposób, aby to osiągnąć (czyli najlepsza praktyka)?
Odpowiedzi
Invoke-Commandma parametr, -ArgumentListktóry może być użyty do podania wartości zmiennych lokalnych w sesji zdalnej. Problem w tym, że to tylko WARTOŚĆ zmiennej. Brak pliku!
Co możesz zrobić:
Użyj Get-Content -Rawna małych plikach, aby zapisać zawartość w zmiennej. W systemie docelowym utwórz plik New-Itemz -Valuetym plikiem. Jednak to nie jest zbyt skuteczne.
Przykład:
$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
Wynik:
Verzeichnis: C:\test # Sry german OS
Mode LastWriteTime Length Name PSComputerName
---- ------------- ------ ---- --------------
-a---- 03.09.2020 12:23 658033 newFile.txt 127.0.0.1
Co powinieneś zrobić:
myślę, że używasz tego Copy-Item -ToSession $Sessionwe właściwy sposób . To śmiecie zrobione specjalnie dla twojego celu. Wadą jest to, że katalog docelowy musi istnieć. Ale i tak potrzebujesz PSSession dla obu poleceń cmdlet. Możesz więc używać Invoke-Commandz tą samą PSSession. Najpierw utwórz PSSession. Służy Invoke-Commanddo tworzenia katalogu. Następnie użyj, Copy-Itemaby przenieść plik w odpowiednie miejsce. Wreszcie możesz Invoke-Commandwykonać kilka czynności końcowych. I nie zapomnij, Remove-PSSessionkiedy skończysz:
$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