无法使用 PSSession 和 Copy-Item cmdlet 在 PowerShell 中复制文件且不出现方法调用错误

无法使用 PSSession 和 Copy-Item cmdlet 在 PowerShell 中复制文件且不出现方法调用错误

我有一个 PowerShell 脚本,它尝试将文件从旧机器传输到新机器。这发生在使用 PowerShell v5 的 Windows 10 上。为此,我更喜欢使用 PSSession 来传输文件。但是,某些文件会引发以下错误:

Copy-Item : Method invocation failed because [System.IO.MemoryStream] does not contain a method named 'new'.
At C:\Users\username\Desktop\Import-ComputerData.ps1:153 char:13
+             Copy-Item -Path "C:\users\$UserName\Desktop" -Destination ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], RuntimeException
    + FullyQualifiedErrorId : System.Management.Automation.RuntimeException,WriteException

以下是导致此问题的相关代码:

    $PSSession = New-PSSession -Computername $ComputerName -ErrorAction SilentlyContinue -ErrorVariable PSSessionError
    ...
    Copy-Item -Path "C:\users\$UserName\Desktop" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Documents" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Favorites" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Pictures" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Downloads" -Destination "C:\users\$UserName\Downloads\Old Downloads" -Recurse -FromSession $PSSession -PassThru -Force
    ...
    Remove-PSSession $PSSession        

该脚本在接收旧机器文件的新电脑上运行。上述错误仅在复制过程中发生。我以为我已经将原因缩小到从互联网下载的文件,需要“解除阻止”,因为整个下载文件夹从未传输过。

我尝试在 Copy-Item cmdlet 之前添加以下代码,但仍然出现相同的错误:

        Invoke-Command -Session $PSSession -ScriptBlock {
            # This unblocks all internet downloaded files. Only use on trusted files.
            Get-ChildItem "c:\users\$UserName\*" -Recurse | Unblock-File 
        }

如果您能提供任何关于如何解决此问题的见解,我们将不胜感激。

答案1

在 PowerShell 支持之前,我编写了一个实用程序来从 C# 执行此操作,方法是使用缓冲区发送文件的半字节,然后通过 WinRM 调用在远程机器上重新组装。这有点迂回,我还没有在 100MB 以上测试过,但它在 100MB 之前运行得很好。您可以在此处查看 C# 文件,并可以复制出 PowerShell 的相关部分并尝试一下...https://github.com/NaosProject/Naos.WinRM/blob/master/Naos.WinRM/Naos.WinRM.cs

相关内容