Powershell - คำสั่ง“ Copy-item” ใน scriptblock ของ Invoke-Command
ฉันต้องการคัดลอกไฟล์จากเซิร์ฟเวอร์ระยะไกลหนึ่งไปยังเซิร์ฟเวอร์อื่นโดยใช้สคริปต์ powershell
สิ่งที่ฉันได้ลอง: -
ในขณะที่ฉันใช้คำสั่ง powershell ต่อไปนี้มันใช้งานได้ดี (หมายถึงไฟล์ที่คัดลอกจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง)
แต่ในขณะที่ฉันใช้สคริปต์ต่อไปนี้จะทำให้เกิดข้อผิดพลาด "ไม่พบเส้นทาง ... " ดังนี้
จริงๆแล้วไฟล์มีอยู่ที่พา ธ นั้น
ฉันได้พยายามอ้างถึงคำถาม - คำตอบต่อไปนี้ stack-overflow แล้ว
- เกิดข้อผิดพลาดกับคำสั่ง PowerShell สำหรับการคัดลอกไฟล์ไปยังเซิร์ฟเวอร์ระยะไกลด้วยข้อมูลรับรอง
- พารามิเตอร์ 'เซสชัน' เป็นโมฆะหรือว่างเปล่าในสคริปต์ PowerShell
- powershell ระยะไกล
- เรียกใช้คำสั่งกับเซสชันระยะไกล: ไม่สามารถตรวจสอบอาร์กิวเมนต์บนพารามิเตอร์
- ไม่สามารถคัดลอกไบนารีไปยัง Azure VM ระยะไกล
- คำสั่ง PowerShell เพื่อคัดลอกไฟล์บนเครื่องระยะไกล
ฉันยังได้พยายามขอความช่วยเหลือโดยใช้ไฟล์
Get-Help Invoke-Command
คำถาม: -
- ฉันจะใช้คำสั่ง "Copy-Item" ภายใน "Invoke-Command (Scriptblock)" ในสคริปต์ (2) เพื่อคัดลอกไฟล์ได้อย่างไร
- มีวิธีใดที่ดีกว่าในการบรรลุเป้าหมายนี้ (หมายถึงแนวทางปฏิบัติที่ดีที่สุด)
คำตอบ
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