使用PowerShell远程复制文件


93

我正在编写要从服务器A运行的PowerShell脚本。我想连接到服务器B并将文件复制到服务器A作为备份。

如果不能这样做,那么我想从服务器A连接到服务器B并将文件复制到服务器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”

Answers:


94

只需使用管理共享即可在系统之间复制文件。这样更容易。

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

85

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。目标是安装了默认PS的Windows Server 2012 R2($ PSVersionTable.PSVersion报告4)。
泰勒·布坎南

2
如果在源上使用-ToSession,则仅源需要安装PS 5。如果在目标上使用-FromSession,则仅目标需要安装PS 5。
泰勒·布坎南

1
当您仅安装了Hypervisor(没有服务器),无需使用会话设置共享时,此方法也适用!
2016年

谢谢!漂亮,优雅的解决方案,类似于scpsshLinux上...无需烦人的股份打扰!
Tobias J

40

使用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

如果我运行两次,我会得到New-PSDrive : A specified logon session does not exist. It may already have been terminated->我认为上一个会话仍在进行->所以我尝试使用Remove-PSDrive->仍然不起作用。也net use <driveLetter> /delete没有帮助。我还能做些其他事情以便能够在软件构建配置中运行此命令吗?
布鲁诺·比耶里

跑步New-PSDrive两次应该没有意义A drive with the name 'Y' already exists.
JPBlanc

我同意两次运行都没有意义。但是它已合并到构建步骤中,并且该构建每天运行几次。因此,我的方法是在完成需要的工作后就删除驱动器,并且我假设一旦执行了新的构建,就可以重新创建驱动器。但这似乎是一个问题。还有其他提示吗?
Bruno Bieri

在安装之前测试是否已安装呢?或者,当您确定所有关闭使用此路径的句柄时,也可以在脚本中使用Remove-PSDrive。
JPBlanc

16

万一远程文件需要您的凭据才能访问,则可以使用cmdlet 生成System.Net.WebClient对象。 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

然后从主机我的机器在运行框中执行以下操作:

\\{IP address of nanoserver}\C$

1
您可能会遇到共享+文件系统权限问题。请记住,限制性最强的权限将获胜,因此即使您在NTFS文件系统层具有访问权限,但如果共享权限限制了您,则您将无法写入。:)
特雷弗·沙利文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.