Powershell - คำสั่ง“ Copy-item” ใน scriptblock ของ Invoke-Command

Sep 02 2020

ฉันต้องการคัดลอกไฟล์จากเซิร์ฟเวอร์ระยะไกลหนึ่งไปยังเซิร์ฟเวอร์อื่นโดยใช้สคริปต์ powershell

สิ่งที่ฉันได้ลอง: -

ในขณะที่ฉันใช้คำสั่ง powershell ต่อไปนี้มันใช้งานได้ดี (หมายถึงไฟล์ที่คัดลอกจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง)

แต่ในขณะที่ฉันใช้สคริปต์ต่อไปนี้จะทำให้เกิดข้อผิดพลาด "ไม่พบเส้นทาง ... " ดังนี้

จริงๆแล้วไฟล์มีอยู่ที่พา ธ นั้น

ฉันได้พยายามอ้างถึงคำถาม - คำตอบต่อไปนี้ stack-overflow แล้ว

  • เกิดข้อผิดพลาดกับคำสั่ง PowerShell สำหรับการคัดลอกไฟล์ไปยังเซิร์ฟเวอร์ระยะไกลด้วยข้อมูลรับรอง
  • พารามิเตอร์ 'เซสชัน' เป็นโมฆะหรือว่างเปล่าในสคริปต์ PowerShell
  • powershell ระยะไกล
  • เรียกใช้คำสั่งกับเซสชันระยะไกล: ไม่สามารถตรวจสอบอาร์กิวเมนต์บนพารามิเตอร์
  • ไม่สามารถคัดลอกไบนารีไปยัง Azure VM ระยะไกล
  • คำสั่ง PowerShell เพื่อคัดลอกไฟล์บนเครื่องระยะไกล

ฉันยังได้พยายามขอความช่วยเหลือโดยใช้ไฟล์

 Get-Help Invoke-Command

คำถาม: -

  1. ฉันจะใช้คำสั่ง "Copy-Item" ภายใน "Invoke-Command (Scriptblock)" ในสคริปต์ (2) เพื่อคัดลอกไฟล์ได้อย่างไร
  2. มีวิธีใดที่ดีกว่าในการบรรลุเป้าหมายนี้ (หมายถึงแนวทางปฏิบัติที่ดีที่สุด)

คำตอบ

T-Me Sep 03 2020 at 19:50

Invoke-Commandมีพารามิเตอร์ที่-ArgumentListสามารถใช้เพื่อจัดหาค่าของตัวแปรโลคัลในเซสชันระยะไกล ปัญหาคือมันเป็นเพียง VALUE ของตัวแปร ไม่มีไฟล์!

สิ่งที่คุณทำได้:
ใช้Get-Content -Rawกับไฟล์ขนาดเล็กเพื่อบันทึกเนื้อหาในตัวแปร บนระบบเป้าหมายสร้างNew-Itemด้วย-Valueไฟล์นั้น อย่างไรก็ตามมันไม่ค่อยมีประสิทธิภาพ

ตัวอย่าง:

$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

ผลลัพธ์:

   Verzeichnis: C:\test    # Sry german OS


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

สิ่งที่คุณควรทำ:
ฉันคิดว่าการใช้ของคุณCopy-Item -ToSession $Sessionเป็นวิธีที่ถูกต้องที่จะทำ มันถูกสร้างขึ้นมาเพื่อจุดประสงค์ของคุณเท่านั้น ข้อเสียคือไดเร็กทอรีเป้าหมายจำเป็นต้องมีอยู่ แต่คุณต้องมี PSSession สำหรับทั้ง cmdlets อยู่ดี คุณจึงสามารถใช้Invoke-Commandกับ PSSession เดียวกันได้ ขั้นแรกให้สร้าง PSSession ใช้Invoke-Commandเพื่อสร้างไดเร็กทอรีของคุณ จากนั้นใช้Copy-Itemเพื่อย้ายไฟล์ของคุณไปยังตำแหน่งที่ถูกต้อง ในที่สุดคุณก็สามารถใช้Invoke-Commandทำขั้นตอนสุดท้ายได้ และอย่าลืมว่าRemove-PSSessionเมื่อคุณทำเสร็จแล้ว:

$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