Powershell - polecenie „Kopiuj element” w bloku skryptu Invoke-Command

Sep 02 2020

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: -

  1. Jak mogę użyć polecenia „Copy-Item” w „Invoke-Command (Scriptblock)” w skrypcie (2), aby skopiować plik?
  2. Czy jest lepszy sposób, aby to osiągnąć (czyli najlepsza praktyka)?

Odpowiedzi

T-Me Sep 03 2020 at 19:50

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