คัดลอกไฟล์จากระยะไกลด้วย PowerShell


95

ฉันกำลังเขียนPowerShellสคริปต์ที่ต้องการเรียกใช้จากเซิร์ฟเวอร์ A ฉันต้องการเชื่อมต่อกับเซิร์ฟเวอร์ B และคัดลอกไฟล์ไปยังเซิร์ฟเวอร์ A เพื่อเป็นการสำรองข้อมูล

หากไม่สามารถทำได้ฉันต้องการเชื่อมต่อกับเซิร์ฟเวอร์ B จากเซิร์ฟเวอร์ A และคัดลอกไฟล์ไปยังไดเรกทอรีอื่นในเซิร์ฟเวอร์ B

ฉันเห็นCopy-Itemคำสั่ง แต่ไม่เห็นวิธีตั้งชื่อคอมพิวเตอร์

ฉันคิดว่าฉันจะทำอะไรได้บ้าง

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

ฉันจะทำเช่นนี้ได้อย่างไร?


4
ในการใช้ Copy-Item คุณจะต้องใช้เส้นทาง UNC เช่น "\\ ServerB \ C $ \ Programs \ temp \ test.txt"

คำตอบ:


97

เพียงใช้การแชร์ของผู้ดูแลระบบเพื่อคัดลอกไฟล์ระหว่างระบบ วิธีนี้ง่ายกว่ามาก

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

การใช้พา ธ UNC แทนพา ธ ของระบบไฟล์ภายในเครื่องช่วยให้แน่ใจว่าสคริปต์ของคุณสามารถเรียกใช้งานได้จากระบบไคลเอ็นต์ใด ๆ ที่สามารถเข้าถึงพา ธ UNC เหล่านั้นได้ หากคุณใช้เส้นทางระบบไฟล์ในเครื่องแสดงว่าคุณกำลังเข้าสู่การรันสคริปต์บนคอมพิวเตอร์เครื่องใดเครื่องหนึ่ง

สิ่งนี้ใช้ได้เฉพาะเมื่อเซสชัน PowerShell ทำงานภายใต้ผู้ใช้ที่มีสิทธิ์ในการแชร์การดูแลระบบทั้งสอง

ฉันขอแนะนำให้ใช้การแชร์เครือข่ายปกติบนเซิร์ฟเวอร์ B พร้อมการเข้าถึงแบบอ่านอย่างเดียวสำหรับทุกคนและเพียงแค่โทร (จากเซิร์ฟเวอร์ A):

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose

9
ปัญหาที่เป็นไปได้อย่างหนึ่งของแนวทางนี้คือ Copy-Item ไม่รองรับข้อมูลประจำตัวทางเลือก (หากคุณต้องรันคำสั่งกับผู้ใช้รายอื่น) ในกรณีนั้นจำเป็นต้องใช้แนวทาง New-PSDrive
จอร์แดน

1
โซลูชันนี้ใช้ได้เฉพาะเมื่อไม่มีไฟร์วอลล์ระหว่างโฮสต์ที่บล็อกการแชร์ UNC ในกรณีนี้วิธีแก้ไขที่ถูกต้องจะอยู่ด้านล่าง ( Copy-Item -FromSession)
Marc

88

ตั้งแต่PowerShell เวอร์ชัน 5 เป็นต้นไป (รวมอยู่ใน Windows Server 2016 ซึ่งสามารถดาวน์โหลดได้โดยเป็นส่วนหนึ่งของ WMF 5 สำหรับเวอร์ชันก่อนหน้า ) สิ่งนี้เป็นไปได้ด้วยการรีบูต ข้อดีของสิ่งนี้คือใช้งานได้แม้ว่าคุณจะไม่สามารถเข้าถึงหุ้นได้ด้วยเหตุผลใดก็ตาม

เพื่อให้ใช้งานได้เซสชันภายในเครื่องที่เริ่มต้นการคัดลอกต้องมี PowerShell 5 ขึ้นไป เซสชันระยะไกลไม่จำเป็นต้องติดตั้ง PowerShell 5 - ใช้ได้กับ PowerShell เวอร์ชันต่ำสุด 2 และ Windows Server เวอร์ชันต่ำสุด 2008 R2 [1]

จากเซิร์ฟเวอร์ A สร้างเซสชันไปยังเซิร์ฟเวอร์ B:

$b = New-PSSession B

จากนั้นยังมาจาก A:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

รายการที่จะคัดลอก B -ToSessionจะทำด้วย โปรดสังเกตว่าโลคัลพา ธ ถูกใช้ในทั้งสองกรณี คุณต้องติดตามว่าคุณอยู่บนเซิร์ฟเวอร์ใด


[1]: เมื่อคัดลอกจากหรือไปยังเซิร์ฟเวอร์ระยะไกลที่มีเฉพาะ PowerShell 2 โปรดระวังข้อบกพร่องนี้ใน PowerShell 5.1ซึ่งในขณะที่เขียนหมายความว่าการคัดลอกไฟล์แบบวนซ้ำใช้ไม่ได้-ToSessionการคัดลอกที่ดูเหมือนจะไม่ทำงาน ทั้งหมดด้วย-FromSession.


3
ฉันพบว่าเซิร์ฟเวอร์ทั้งสองไม่จำเป็นต้องติดตั้ง PS 5 ฉันเพิ่งทำการทดสอบสำเร็จโดยเฉพาะเซิร์ฟเวอร์ต้นทาง (Windows 10) เท่านั้นที่ติดตั้ง PS 5 เป้าหมายคือ Windows Server 2012 R2 ที่ติดตั้ง PS เริ่มต้น ($ PSVersionTable.PSVersion รายงาน 4)
Taylor Buchanan

2
หากคุณใช้ -ToSession บนแหล่งที่มาเฉพาะแหล่งที่มาเท่านั้นที่ต้องติดตั้ง PS 5 หากคุณใช้ -FromSession กับเป้าหมายเป้าหมายเท่านั้นที่ต้องการ PS 5 ติดตั้ง
Taylor Buchanan

1
นอกจากนี้ยังใช้งานได้เมื่อคุณติดตั้ง Hypervisor เท่านั้น (ไม่มีเซิร์ฟเวอร์) ไม่จำเป็นต้องตั้งค่าการแชร์เพียงแค่ใช้เซสชัน!
มืดมน

ขอบคุณ! นีซ, ทางออกที่สวยงามคล้ายกับscpกว่าsshบน Linux ... ไม่จำเป็นต้องกังวลกับหุ้นที่น่ารำคาญ!
Tobias J

40

ใช้net useหรือNew-PSDriveสร้างไดรฟ์ใหม่:

New-PsDrive:สร้าง PsDrive ใหม่ที่มองเห็นได้เฉพาะในสภาพแวดล้อม PowerShell:

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

การใช้งานสุทธิ:สร้างไดรฟ์ใหม่ที่มองเห็นได้ในทุกส่วนของระบบปฏิบัติการ

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

หากฉันเรียกใช้สิ่งนี้สองครั้งฉันจะได้รับNew-PSDrive : A specified logon session does not exist. It may already have been terminated-> ฉันคิดว่าเซสชันก่อนหน้ายังคงดำเนินอยู่ -> ดังนั้นฉันจึงพยายามใช้Remove-PSDrive-> ก็ยังไม่ได้ผล ยังnet use <driveLetter> /deleteไม่ช่วย มีอะไรอีกบ้างที่ฉันสามารถทำได้เพื่อเรียกใช้คำสั่งนี้ในการกำหนดค่าการสร้างซอฟต์แวร์
Bruno Bieri

ไม่มีเหตุผลที่จะวิ่งNew-PSDriveสองครั้งที่คุณควรมีA drive with the name 'Y' already exists.
JPBlanc

ฉันยอมรับว่ามันไม่มีเหตุผลที่จะเรียกใช้สองครั้ง แต่รวมอยู่ในขั้นตอนการสร้างและการสร้างจะทำงานหลายครั้งต่อวัน ดังนั้นแนวทางของฉันคือการลบไดรฟ์เมื่อฉันทำงานที่ต้องการและฉันคิดว่ามันจะไม่มีปัญหาในการสร้างมันขึ้นมาใหม่เมื่อมีการเรียกใช้งานบิลด์ใหม่เกิดขึ้น แต่ดูเหมือนว่าจะมีปัญหา คำใบ้อื่น ๆ ?
Bruno Bieri

แล้วการทดสอบว่าติดตั้งก่อนติดตั้งหรือไม่? หรือคุณสามารถใช้ Remove-PSDrive ในสคริปต์ของคุณเมื่อคุณแน่ใจว่าแฮนเดิลทั้งหมดที่ใช้พา ธ นี้ปิดอยู่
JPBlanc

16

ในกรณีที่ไฟล์ระยะไกลต้องการข้อมูลรับรองของคุณในการเข้าถึงคุณสามารถสร้างวัตถุSystem.Net.WebClientโดยใช้ cmdlet New-Objectเพื่อ "คัดลอกไฟล์จากระยะไกล" ได้เช่นนั้น

$Source = "\\192.168.x.x\somefile.txt"
$Dest   = "C:\Users\user\somefile.txt"
$Username = "username"
$Password = "password"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

$WebClient.DownloadFile($Source, $Dest)

หรือหากคุณต้องการอัปโหลดไฟล์คุณสามารถใช้ UploadFile:

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)

1
@klm_ ช่วยอธิบายหน่อยได้มั้ยคะ?
FastTrack

0

ไม่มีคำตอบข้างต้นทำงานให้ฉัน ฉันได้รับข้อผิดพลาดนี้เรื่อย ๆ :

Copy-Item : Access is denied
+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

ดังนั้นสิ่งนี้จึงทำให้ฉัน:

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

จากโฮสต์ของฉันเครื่องของฉันในกล่อง Run ฉันเพิ่งทำสิ่งนี้:

\\{IP address of nanoserver}\C$

1
โอกาสที่คุณจะประสบปัญหาเกี่ยวกับสิทธิ์การแชร์ + ระบบไฟล์ โปรดจำไว้ว่าสิทธิ์ที่ จำกัด ที่สุดจะชนะดังนั้นแม้ว่าคุณจะมีสิทธิ์เข้าถึงที่เลเยอร์ระบบไฟล์ NTFS หากสิทธิ์การแชร์ จำกัด คุณคุณจะไม่สามารถเขียนได้ :)
Trevor Sullivan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.