Powershell - Perintah "Salin-item" di scriptblock dari Invoke-Command

Sep 02 2020

Saya perlu menyalin file dari satu server jauh ke yang lain menggunakan skrip PowerShell.

Apa yang telah saya coba: -

Sementara saya menggunakan perintah PowerShell berikut, itu berfungsi dengan baik. (Berarti file disalin dari satu server ke server lain)

Tetapi ketika saya menggunakan skrip berikut ini memberikan kesalahan "tidak dapat menemukan jalur ..." sebagai berikut

Sebenarnya, file ada di jalur itu.

Saya telah mencoba untuk merujuk berikut stack-overflow sudah tanya-jawab

  • Kesalahan dengan perintah PowerShell untuk menyalin file ke server jarak jauh dengan kredensial
  • Parameter 'Session' kosong atau kosong di skrip PowerShell
  • PowerShell jarak jauh
  • Perintah-Panggil dengan sesi jarak jauh: Tidak dapat memvalidasi argumen pada parameter
  • Tidak dapat menyalin biner ke Azure VM jarak jauh
  • Perintah PowerShell untuk Menyalin File di Mesin Jarak Jauh

Saya juga mencoba mendapatkan bantuan untuk menggunakan

 Get-Help Invoke-Command

Pertanyaan :-

  1. Bagaimana saya bisa menggunakan perintah "Copy-Item" di dalam "Invoke-Command (Scriptblock)" di script (2) untuk menyalin file?
  2. Adakah cara yang lebih baik untuk mencapai ini (berarti praktik terbaik)?

Jawaban

T-Me Sep 03 2020 at 19:50

Invoke-Commandmemiliki parameter -ArgumentListyang dapat digunakan untuk menyediakan nilai variabel lokal di sesi jarak jauh. Masalahnya adalah: itu hanya NILAI variabel. Tidak ada dokumen!

Yang dapat Anda lakukan:
Gunakan Get-Content -Rawpada file kecil untuk menyimpan kontan dalam variabel. Pada sistem target buatlah New-Itemdengan -Valuefile itu. Namun itu tidak terlalu efektif.

Contoh:

$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

Hasil:

   Verzeichnis: C:\test    # Sry german OS


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

Apa yang harus Anda lakukan:
Saya pikir penggunaan Anda Copy-Item -ToSession $Sessionadalah cara yang tepat untuk melakukannya. Ini serba-serbi dibuat hanya untuk tujuan Anda. Sisi negatifnya adalah, direktori target harus ada. Tapi Anda tetap membutuhkan PSSession untuk kedua cmdlet. Jadi Anda bisa menggunakan Invoke-Commanddengan PSSession yang sama. Pertama Buat PSSession. Gunakan Invoke-Commanduntuk membuat direktori Anda. Kemudian gunakan Copy-Itemuntuk memindahkan file Anda ke tempat yang tepat. Akhirnya Anda dapat menggunakan Invoke-Commanduntuk melakukan beberapa langkah penyelesaian. Dan jangan lupa Remove-PSSessionketika Anda selesai:

$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