使用PowerShell远程复制文件

使用PowerShell远程复制文件,powershell,powershell-2.0,Powershell,Powershell 2.0,我正在编写要从服务器a运行的PowerShell脚本。 我想连接到服务器B并将文件复制到服务器a作为备份 如果不能做到这一点,那么我想从服务器A连接到服务器B,并将文件复制到服务器B中的另一个目录 我看到了这个命令,但我不知道如何给它一个计算机名 我本以为我可以做这样的事 Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use S

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

如果不能做到这一点,那么我想从服务器A连接到服务器B,并将文件复制到服务器B中的另一个目录

我看到了这个命令,但我不知道如何给它一个计算机名

我本以为我可以做这样的事

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

如何执行此操作?

使用
net Use
New PSDrive
创建新驱动器:

新建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
只需使用管理共享在系统之间复制文件。 这样容易多了

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;
通过使用UNC路径而不是本地文件系统路径,您可以帮助 确保您的脚本可以从任何具有 访问这些UNC路径。如果使用本地文件系统路径,则 在特定的计算机上运行脚本

仅当PowerShell会话在对这两个管理共享都具有权限的用户下运行时,此选项才起作用

我建议使用服务器B上的常规网络共享,以只读方式访问所有人,只需(从服务器A)呼叫即可:


如果远程文件需要您的凭据才能访问,您可以使用cmdlet New object生成System.Net.WebClient对象以“远程复制文件”,如下所示

或者,如果需要上载文件,可以使用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
然后从我的主机我的机器在运行箱我只是这样做:

\\{IP address of nanoserver}\C$

从PowerShell第5版起(包括在Windows Server 2016中),远程处理就可以实现这一点。这样做的好处是,即使出于任何原因,您无法访问共享,它也能工作

要使其工作,启动复制的本地会话必须安装PowerShell 5或更高版本。远程会话不需要安装PowerShell 5,它可以与低至2的PowerShell版本和低至2008 R2的Windows Server版本一起使用。[1]

从服务器A创建到服务器B的会话:

$b = New-PSSession B
然后,还是从一个:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt
使用
-ToSession
将项目复制到B。请注意,在这两种情况下都使用本地路径;您必须跟踪您所在的服务器



[1] :当从仅具有PowerShell 2的远程服务器复制或复制到该服务器时,请注意,在编写本文时,这意味着递归文件复制不适用于
-ToSession
,显然,复制根本不适用于
-FromSession

这种方法的一个可能问题是复制项不支持备用凭据(如果您必须使用其他用户运行该命令)。在这种情况下,需要新的PSDrive方法。只有在主机之间没有防火墙阻止UNC共享时,此解决方案才有效。在这种情况下,正确的解决方案如下(
Copy Item-FromSession
)。很可能您在共享+文件系统权限方面遇到问题。请记住,限制性最强的权限将获胜,因此即使您在NTFS文件系统层拥有访问权限,如果共享权限限制您,您也将无法写入。:)我发现两台服务器都没有必要安装PS5。我刚刚执行了一个成功的测试,其中只有源服务器(Windows 10)安装了PS 5。目标是安装了默认PS的Windows Server 2012 R2($PSVersionTable.PSVersion reports 4)。如果在源上使用-ToSession,则只有源需要安装PS 5。如果您在目标系统上使用-FromSession,则只有目标系统需要安装PS 5。当您只安装了虚拟机监控程序(没有服务器)时,也可以这样做,无需设置共享,只需使用会话即可!非常感谢。漂亮、优雅的解决方案,类似于Linux上的
scp
over
ssh
。。。不必为讨厌的股票烦恼@你能解释一下你的意思吗?如果我运行两次,我会得到新的PSDrive:指定的登录会话不存在。它可能已经被终止了->我想上一个会话仍在进行->因此我尝试使用
删除PSDrive
->但它仍然不工作。而且
net use/delete
也没有帮助。我能做的任何其他事情都可以在软件构建配置中运行此命令吗?运行两次
New PSDrive
没有意义您应该已经有一个名为“Y”的驱动器。我同意运行两次没有意义。但是它被合并到一个构建步骤中,并且构建一天运行几次。因此,我的方法是在完成所需工作后移除驱动器,并且我假设在新构建执行后重新创建驱动器不会有问题。但这似乎是个问题。还有其他提示吗?在安装之前测试是否已安装?或者,当您确定使用此路径的所有句柄都已关闭时,可以在脚本中使用Remove PSDrive。
$b = New-PSSession B
Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt