2

У меня есть сценарий PowerShell, который пытается перенести файлы со старой машины на новую. Это происходит в Windows 10 с PowerShell v5. Для этого я бы предпочел использовать 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, и все еще получаю те же ошибки:

        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 ответ1

0

Я написал утилиту для выполнения этого из C # до того, как PowerShell получил поддержку, используя буфер для отправки фрагментов файла, а затем повторной сборки на удаленной машине с помощью вызовов WinRM. Это немного круто, и я не тестировал его более чем на 100 МБ, но до этого он работал очень хорошо. Вы можете посмотреть файл C # здесь и скопировать соответствующие фрагменты PowerShell и попробовать это ... https://github.com/NaosProject/Naos.WinRM/blob/master/Naos.WinRM/Naos.WinRM.cs

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .