Sao chép tệp từ xa bằng PowerShell


94

Tôi đang viết tập lệnh PowerShell mà tôi muốn chạy từ Máy chủ A. Tôi muốn kết nối với Máy chủ B và sao chép tệp vào Máy chủ A làm bản sao lưu.

Nếu điều đó không thể được thực hiện thì tôi muốn kết nối với Máy chủ B từ Máy chủ A và sao chép tệp vào một thư mục khác trong Máy chủ B.

Tôi thấy Copy-Itemlệnh, nhưng tôi không thấy cách đặt tên máy tính cho nó.

Tôi đã nghĩ rằng tôi có thể làm một cái gì đó như

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

Tôi có thể làm cái này như thế nào?


4
Để sử dụng Copy-Item, bạn sẽ phải sử dụng đường dẫn UNC như "\\ ServerB \ C $ \ Programs \ temp \ test.txt"

Câu trả lời:


95

Chỉ cần sử dụng chia sẻ quản trị để sao chép tệp giữa các hệ thống. Nó dễ dàng hơn nhiều theo cách này.

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

Bằng cách sử dụng đường dẫn UNC thay vì đường dẫn hệ thống tệp cục bộ, bạn sẽ giúp đảm bảo rằng tập lệnh của bạn có thể thực thi được từ bất kỳ hệ thống khách nào có quyền truy cập vào các đường dẫn UNC đó. Nếu bạn sử dụng đường dẫn hệ thống tệp cục bộ, thì bạn đang dồn mình vào việc chạy tập lệnh trên một máy tính cụ thể.

Điều này chỉ hoạt động khi phiên PowerShell chạy dưới quyền của người dùng có quyền đối với cả phần chia sẻ quản trị.

Tôi đề xuất sử dụng chia sẻ mạng thông thường trên máy chủ B với quyền truy cập chỉ đọc cho mọi người và chỉ cần gọi (từ Máy chủ A):

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

9
Một vấn đề có thể xảy ra với phương pháp này là Copy-Item không hỗ trợ thông tin đăng nhập thay thế (nếu bạn phải chạy lệnh với một người dùng khác). Trong trường hợp đó, cách tiếp cận New-PSDrive là bắt buộc.
Jordan

1
Giải pháp này chỉ hoạt động nếu không có tường lửa giữa các máy chủ chặn chia sẻ UNC. Trong trường hợp đó, giải pháp chính xác là bên dưới ( Copy-Item -FromSession).
Marc

85

Từ phiên bản PowerShell 5 trở đi (bao gồm trong Windows Server 2016, có thể tải xuống như một phần của WMF 5 cho các phiên bản trước đó ), điều này có thể thực hiện được với quá trình xóa. Lợi ích của việc này là nó hoạt động ngay cả khi, vì bất kỳ lý do gì, bạn không thể truy cập vào phần chia sẻ.

Để điều này hoạt động, phiên cục bộ nơi bắt đầu sao chép phải được cài đặt PowerShell 5 trở lên. Phiên từ xa không cần phải cài đặt PowerShell 5 - nó hoạt động với các phiên bản PowerShell thấp nhất là 2 và các phiên bản Windows Server thấp nhất là 2008 R2. [1]

Từ máy chủ A, tạo phiên đến máy chủ B:

$b = New-PSSession B

Và sau đó, vẫn từ A:

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

Sao chép các mục sang B được thực hiện với -ToSession. Lưu ý rằng đường dẫn cục bộ được sử dụng trong cả hai trường hợp; bạn phải theo dõi máy chủ bạn đang ở.


[1]: khi sao chép từ hoặc tới một máy chủ từ xa chỉ có PowerShell 2, hãy cẩn thận với lỗi này trong PowerShell 5.1 , tại thời điểm viết bài này có nghĩa là sao chép tệp đệ quy không hoạt động -ToSession, việc sao chép dường như không hoạt động tại tất cả với -FromSession.


3
Tôi thấy rằng cả hai máy chủ đều không cần phải cài đặt PS 5. Tôi vừa thực hiện một thử nghiệm thành công trong đó chỉ máy chủ nguồn (Windows 10) có cài đặt PS 5. Mục tiêu là Windows Server 2012 R2 có cài đặt PS mặc định ($ PSVersionTable.PSVersion báo cáo 4).
Taylor Buchanan

2
Nếu bạn sử dụng -ToSession trên nguồn, chỉ nguồn cần cài đặt PS 5. Nếu bạn sử dụng -FromSession trên mục tiêu, chỉ mục tiêu cần cài đặt PS 5.
Taylor Buchanan

1
Điều này cũng hoạt động khi bạn chỉ cài đặt Hypervisor (không có máy chủ), không cần thiết lập chia sẻ chỉ cần sử dụng các phiên!
ngắn gọn,

Cảm ơn bạn! Nice, giải pháp tao nhã, tương tự như scptrên sshtrên Linux ... không cần phải bận tâm với cổ phiếu pesky!
Tobias J

40

Sử dụng net usehoặc New-PSDriveđể tạo ổ đĩa mới:

New-PsDrive: tạo một PsDrive mới chỉ hiển thị trong môi trường PowerShell:

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

Sử dụng thực: tạo ổ đĩa mới hiển thị trong tất cả các phần của HĐH.

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

Nếu tôi chạy điều này hai lần, tôi nhận được New-PSDrive : A specified logon session does not exist. It may already have been terminated-> Tôi nghĩ rằng một phiên trước đó vẫn đang diễn ra -> Vì vậy, tôi đã cố gắng sử dụng Remove-PSDrive-> vẫn nó không hoạt động. Cũng net use <driveLetter> /deletekhông giúp được gì. Tôi có thể làm gì khác để có thể chạy lệnh này trong cấu hình xây dựng phần mềm không?
Bruno Bieri

Nó không có ý nghĩa để chạy New-PSDrivehai lần bạn nên cóA drive with the name 'Y' already exists.
JPBlanc

Tôi đồng ý rằng nó không có ý nghĩa gì để chạy nó hai lần. Nhưng nó được kết hợp vào một bước xây dựng và quá trình xây dựng chạy nhiều lần trong ngày. Vì vậy, cách tiếp cận của tôi là xóa ổ đĩa sau khi tôi thực hiện công việc mình cần và tôi cho rằng sẽ không có vấn đề gì khi tạo lại nó khi một lần thực thi bản dựng mới xảy ra. Nhưng nó có vẻ là một vấn đề mặc dù. Bất kỳ gợi ý nào khác?
Bruno Bieri

Còn về việc kiểm tra nếu nó được gắn trước khi lắp vào? hoặc bạn có thể sử dụng Remove-PSDrive trong tập lệnh của mình khi bạn chắc chắn rằng tất cả các chốt xử lý sử dụng đường dẫn này đều bị đóng.
JPBlanc

16

Chỉ trong trường hợp tệp từ xa cần thông tin đăng nhập của bạn để được truy cập, bạn có thể tạo đối tượng System.Net.WebClient bằng cách sử dụng lệnh ghép ngắn New-Object để "Sao chép tệp từ xa", như vậy

$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)

Hoặc nếu bạn cần tải tệp lên, bạn có thể sử dụng UploadFile:

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

$WebClient.UploadFile($Dest, $Source)

1
@klm_ Bạn có thể vui lòng giải thích ý bạn được không?
FastTrack

0

Không có câu trả lời nào ở trên phù hợp với tôi. Tôi tiếp tục gặp lỗi này:

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

Vì vậy, điều này đã làm điều đó cho tôi:

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

Sau đó, từ máy chủ của tôi, máy của tôi trong hộp Run, tôi vừa thực hiện điều này:

\\{IP address of nanoserver}\C$

1
Rất có thể bạn gặp phải sự cố với quyền chia sẻ + hệ thống tệp. Hãy nhớ rằng các quyền hạn chế nhất sẽ giành chiến thắng, vì vậy ngay cả khi bạn có quyền truy cập ở lớp hệ thống tệp NTFS, nếu quyền chia sẻ hạn chế bạn, thì bạn sẽ không thể ghi. :)
Trevor Sullivan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.