【问题标题】:Copy file remotely with PowerShell使用 PowerShell 远程复制文件
【发布时间】:2012-05-31 06:43:34
【问题描述】:

我正在编写一个我想从服务器 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)

我该怎么做?

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    PowerShell 版本 5 开始(包含在 Windows Server 2016 中,downloadable as part of WMF 5 for earlier versions),这可以通过远程处理实现。这样做的好处是,即使出于某种原因您无法访问共享,它也能正常工作。

    为此,启动复制的本地会话必须安装 PowerShell 5 或更高版本。远程会话不需要需要安装 PowerShell 5 - 它适用于低至 2 的 PowerShell 版本和低至 2008 R2 的 Windows Server 版本。[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 的远程服务器复制时,请注意 this bug in PowerShell 5.1,这在撰写本文时意味着递归文件复制不适用于 -ToSession,显然复制不起作用-FromSession 根本不工作。

    【讨论】:

    • 我发现两台服务器都没有必要安装 PS 5。我刚刚执行了一个成功的测试,其中只有源服务器(Windows 10)安装了 PS 5。目标是安装了默认 PS 的 Windows Server 2012 R2($PSVersionTable.PSVersion 报告 4)。
    • 如果你在源上使用-ToSession,只有源需要安装PS 5。如果在目标上使用 -FromSession,则只有目标需要安装 PS 5。
    • 这也适用于您只安装了 Hypervisor(没有服务器),无需设置共享,只需使用会话!
    • 谢谢!不错,优雅的解决方案,类似于 Linux 上的 scpssh... 无需为讨厌的共享而烦恼!
    • 我知道这是一篇旧帖子,但我试图实现类似的目标:我在 PC A 上工作,想通过 LAN 将文件从 PC B 复制到 PC C。任何想法如何做到这一点?
    【解决方案2】:

    只需使用管理共享在系统之间复制文件。 这样就容易多了。

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

    通过使用 UNC 路径而不是本地文件系统路径,您可以帮助 确保您的脚本可以从任何客户端系统执行 访问这些 UNC 路径。如果您使用本地文件系统路径,那么您 正在逼着自己在特定的计算机上运行脚本。

    【讨论】:

    • 这种方法的一个可能问题是 Copy-Item 不支持备用凭据(如果您必须使用其他用户运行命令)。在这种情况下,需要 New-PSDrive 方法。
    • 此解决方案仅在阻止 UNC 共享的主机之间没有防火墙时才有效。在这种情况下,正确的解决方案如下 (Copy-Item -FromSession)。
    【解决方案3】:

    使用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.是没有意义的
    • 我同意运行两次是没有意义的。但它被合并到构建步骤中,并且构建每天运行数次。因此,我的方法是在完成所需的工作后移除驱动器,并且我假设一旦发生新的构建执行重新创建它就没有问题。但这似乎是一个问题。还有其他提示吗?
    • 在安装之前测试它是否已安装呢?或者,当您确定使用此路径的所有句柄都已关闭时,您可以在脚本中使用 Remove-PSDrive。
    【解决方案4】:

    万一远程文件需要您的凭据才能访问,您可以使用 cmdlet New-Object 生成一个 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)
    

    【讨论】:

    • @klm_ 你能解释一下你的意思吗?
    【解决方案5】:

    以上答案都没有对我有用。我一直收到这个错误:

    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$
    

    【讨论】:

    • 您可能遇到了共享+文件系统权限的问题。请记住,最严格的权限获胜,因此即使您在 NTFS 文件系统层具有访问权限,如果共享权限限制您,那么您将无法写入。 :)
    • 使用 PowerShell 远程复制文件。这不能回答操作问题
    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2022-01-28
    • 2013-06-01
    • 2021-03-25
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多