Powershell - Lệnh “Copy-item” trong scriptblock của Invoke-Command

Sep 02 2020

Tôi cần sao chép tệp từ máy chủ từ xa này sang máy chủ khác bằng tập lệnh powershell.

Những gì tôi đã thử: -

Mặc dù tôi sử dụng các lệnh sau powershell nhưng nó hoạt động tốt. (Có nghĩa là tệp được sao chép từ máy chủ này sang máy chủ khác)

Nhưng trong khi tôi sử dụng tập lệnh sau, nó báo lỗi "không thể tìm thấy đường dẫn ..." như sau

Trên thực tế, tệp tồn tại ở đường dẫn đó.

Tôi đã cố gắng tham khảo câu trả lời câu hỏi-câu trả lời đã có stack-tràn

  • Lỗi với lệnh PowerShell để sao chép tệp vào máy chủ từ xa với thông tin xác thực
  • Tham số 'Session' rỗng hoặc trống trong tập lệnh PowerShell
  • điều khiển từ xa powershell
  • Gọi-Lệnh với phiên từ xa: Không thể xác thực đối số trên tham số
  • Không thể sao chép tệp nhị phân vào máy ảo Azure từ xa
  • Lệnh PowerShell để sao chép tệp trên máy từ xa

Tôi cũng đã cố gắng nhận trợ giúp bằng cách sử dụng

 Get-Help Invoke-Command

Câu hỏi: -

  1. Làm cách nào tôi có thể sử dụng lệnh "Copy-Item" bên trong "Invoke-Command (Scriptblock)" trong script (2) để sao chép tệp?
  2. Có cách nào tốt hơn để đạt được điều này (có nghĩa là thực hành tốt nhất) không?

Trả lời

T-Me Sep 03 2020 at 19:50

Invoke-Commandcó tham số -ArgumentListmà có thể được sử dụng để cung cấp các giá trị của các biến cục bộ trong phiên từ xa. Vấn đề là: nó chỉ là GIÁ TRỊ của biến. Không có tập tin!

Những gì bạn có thể làm:
Sử dụng Get-Content -Rawtrên các tệp nhỏ để lưu nội dung trong một biến. Trên hệ thống mục tiêu tạo ra một New-Itemvới -Valuecác tập tin đó. Tuy nhiên điều đó không hiệu quả lắm.

Thí dụ:

$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

Kết quả:

   Verzeichnis: C:\test    # Sry german OS


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

Bạn nên làm gì:
Tôi nghĩ việc bạn sử dụng Copy-Item -ToSession $Sessionlà cách làm đúng. Nó được tạo ra chỉ vì mục đích của bạn. Nhược điểm là thư mục đích cần phải tồn tại. Nhưng dù sao thì bạn cũng cần một PSSession cho cả hai lệnh ghép ngắn. Vì vậy, bạn có thể sử dụng Invoke-Commandvới cùng một PSSession. Đầu tiên Tạo một PSSession. Sử dụng Invoke-Commandđể tạo thư mục cho bạn. Sau đó, sử dụng Copy-Itemđể di chuyển tệp của bạn đến đúng nơi. Cuối cùng, bạn có thể sử dụng Invoke-Commandđể thực hiện một số bước hoàn thiện. Và đừng quên Remove-PSSessionkhi bạn hoàn thành:

$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