使用 PowerShell 远程复制文件

我正在编写一个 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)

我怎么能这么做?

422167 次浏览

使用 net useNew-PSDrive创建新的驱动器:

New-psDrive: 创建一个仅在 PowerShell 环境中可见的新 psDrive:

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

净使用: 在操作系统的所有部分创建一个可见的新驱动器。

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

Simply use the administrative shares to copy files between systems. It's much easier this way.

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

通过使用 UNC 路径而不是本地文件系统路径,可以帮助 确保您的脚本可以从任何客户端系统执行 访问这些 UNC 路径 在特定的电脑上运行脚本。

为了防止远程文件需要凭证才能访问,可以使用 cmdlet 新对象生成一个 System.Net.WebClient对象来“远程复制文件”,如下所示

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

以上的答案对我来说都不管用,我总是得到这样的错误:

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

Then from my host my machine in the Run box I just did this:

\\{IP address of nanoserver}\C$

PowerShell 版本5以上(包含在 WindowsServer2016,可作为早期版本的 WMF5的一部分下载中) ,这可以通过远程处理实现。这样做的好处是,即使出于某种原因,您无法访问共享,它也能正常工作。

为了实现这一点,启动复制的本地会话必须安装 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中的这个 bug,在编写本文时,PowerShell 5.1中的这个 bug意味着递归文件复制不能用于 -ToSession,一个明显的复制显然不能用于 -FromSession