Powershell - Perintah "Salin-item" di scriptblock dari Invoke-Command
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 :-
- Bagaimana saya bisa menggunakan perintah "Copy-Item" di dalam "Invoke-Command (Scriptblock)" di script (2) untuk menyalin file?
- Adakah cara yang lebih baik untuk mencapai ini (berarti praktik terbaik)?
Jawaban
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