Dateien können in PowerShell nicht mit dem Cmdlet PSSession und Copy-Item ohne einen Methodenaufruffehler kopiert werden

798
cyborgcommando0

Ich habe ein PowerShell-Skript, das versucht, Dateien von einem alten Computer auf einen neuen zu übertragen. Dies tritt unter Windows 10 mit PowerShell v5 auf. Zu diesem Zweck würde ich es vorziehen, PSSession zum Übertragen von Dateien zu verwenden. Bestimmte Dateien geben jedoch den folgenden Fehler aus:

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 

Hier ist der relevante Code, der dies verursacht:

 $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  

Das Skript wird auf dem neuen PC ausgeführt und empfängt die Dateien von der alten Maschine. Der oben genannte Fehler tritt nur während des Kopiervorgangs auf. Ich dachte, ich hätte die Ursache auf Dateien beschränkt, die aus dem Internet heruntergeladen wurden, und musste "Unblocked" werden, da der gesamte Download-Ordner niemals übertragen wurde.

Ich habe versucht, den folgenden Code vor meinen Copy-Item-Cmdlets hinzuzufügen, und ich bekomme immer noch dieselben Fehler:

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

Jede Einsicht, wie man das umgehen kann, wäre dankbar.

2
Haben Sie ":: new" irgendwo in dem Code, den Sie nicht in Ihrem Beitrag enthalten haben? Als Teil des Speicherstroms? Wenn Sie `[System.IO.MemoryStream] :: new` verwenden, verwenden Sie stattdessen` [System.IO.MemoryStream] `. root vor 6 Jahren 0
@ root Ich habe diesen Code nirgendwo in meinem Code. Der Fehler scheint während des Kopiervorgangs zu erscheinen und die betroffenen Dateien werden aus dem Internet oder einem anderen Computer heruntergeladen. cyborgcommando0 vor 6 Jahren 0
Ich frage wegen einiger Kommentare hier: https://sharepointstew.wordpress.com/2016/02/26/large-file-upload-in-sharepoint-online-with-csom-powershell/. Sie sprechen auch mit der Dateigröße, die zum Fehler beiträgt. root vor 6 Jahren 0
@root Vielleicht war dies der Fall für eine andere Verwendung dieses Snippets, aber ich habe heute denselben Fehler festgestellt, als einige Dateien nicht übertragen wurden und eine Größe von 1 KB hatten. Ich habe noch keinen Link gefunden, von dem ich noch überzeugt bin, aber ich denke immer noch, dass er mit Internet oder "nicht vertrauenswürdigen" Dateien von einer anderen Quelle als der Quellmaschine zusammenhängt cyborgcommando0 vor 6 Jahren 0

1 Antwort auf die Frage

0
wlscaudill

Ich habe ein Hilfsprogramm geschrieben, um dies von C # aus durchzuführen, bevor PowerShell unterstützt wurde, indem der Puffer zum Senden von Halbbytes der Datei verwendet wurde, die dann auf dem Remote-Computer über WinRM-Aufrufe wieder zusammengefügt wurden. Es ist etwas umständlich und ich habe es nicht über 100 MB getestet, aber es funktioniert wirklich gut. Sie können sich die C # -Datei hier ansehen und könnten die relaventen Teile der PowerShell kopieren und versuchen, dies zu tun ... https://github.com/NaosProject/Naos.WinRM/blob/master/Naos.WinRM/Naos.WinRM.cs