Powershell 我需要从$Recycle.bin还原超过40000个项目

Powershell 我需要从$Recycle.bin还原超过40000个项目,powershell,Powershell,我需要从回收站恢复40000多个项目,通过GUI它使用了大量内存,系统几乎挂起,即使我一次恢复100个项目。因此,我在PowerShell中编写了以下脚本,但出现以下错误: VERBOSE: Performing the operation "Move Directory" on target "Item: E:\$RECYCLE.BIN\S-1-5-21-45987200-1508583899-68119131-500\$R2FXY9E Destination: E:\OneDrive - M

我需要从回收站恢复40000多个项目,通过GUI它使用了大量内存,系统几乎挂起,即使我一次恢复100个项目。因此,我在PowerShell中编写了以下脚本,但出现以下错误:

VERBOSE: Performing the operation "Move Directory" on target "Item: E:\$RECYCLE.BIN\S-1-5-21-45987200-1508583899-68119131-500\$R2FXY9E Destination: E:\OneDrive - MHG - Brasil\Admin_Fin\Silvia\Silvia\Clientes\Miller Heiman Group\Embraer\Fase I\ARIBA\Embraer - Evento - Resumo_arquivos".
Move-Item : Could not find a part of the path.
At E:\Scripts\ListaRecycled.ps1:7 char:6
+      Move-Item $item.Path $CaminhoCompleto -Force -Verbose
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (E:\$RECYCLE.BIN...31-500\$R2FXY9E:DirectoryInfo) [Move-Item], 
DirectoryNotFoundException
    + FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
在我的代码中,我正在执行以下操作:

$Shell = New-Object -ComObject Shell.Application
$Global:Recycler = $Shell.NameSpace(0xa)
$Excluidos = $Recycler.Items()
foreach ($item in $Excluidos)
{
  $CaminhoCompleto = Join-Path $Recycler.GetDetailsOf($item,1) $Recycler.GetDetailsOf($item,0)
  Move-Item $item.Path $CaminhoCompleto -Force -Verbose
}
$permissoes = Get-Acl $item.Path -Verbose
Move-Item -LiteralPath $item.Path -Destination $CaminhoCompleto -Verbose -ErrorVariable +Err     
Set-Acl -Path $CaminhoCompleto -AclObject $permissoes -Verbose

谢谢。

您使用的是未命名的位置参数<代码>移动项将位置0处的参数作为
路径
参数,该参数受shell全局化的影响

您通常应该使用命名参数,在这种情况下,您确实希望使用
-LiteralPath
,而不是
-Path

Move-Item -LiteralPath $item.Path -DestinationPath $CaminhoCompleto -Force -Verbose

我发现了。
Move Item
cmdlet不会创建文件夹路径,因此我在脚本中添加了以下内容:

if(!(Test-Path $Recycler.GetDetailsOf($item,1)))
 {
   New-Item -Path $Recycler.GetDetailsOf($item,1) -ItemType Directory -Force -Verbose -OutVariable +Dir

 }
我也发现丢失了很多东西。然后我添加了以下内容:

$Shell = New-Object -ComObject Shell.Application
$Global:Recycler = $Shell.NameSpace(0xa)
$Excluidos = $Recycler.Items()
foreach ($item in $Excluidos)
{
  $CaminhoCompleto = Join-Path $Recycler.GetDetailsOf($item,1) $Recycler.GetDetailsOf($item,0)
  Move-Item $item.Path $CaminhoCompleto -Force -Verbose
}
$permissoes = Get-Acl $item.Path -Verbose
Move-Item -LiteralPath $item.Path -Destination $CaminhoCompleto -Verbose -ErrorVariable +Err     
Set-Acl -Path $CaminhoCompleto -AclObject $permissoes -Verbose

我认为您的垃圾箱中有一个对象的名称为空或无效。我尝试了上面的代码,结果发现我有一个没有名字的文件夹(甚至不知道它从哪里来),但由于join path函数的运行方式,它坏了。它找到了旧路径并尝试将空白名称连接到该路径,然后尝试将其移动到基本文件夹上。不确定这是否也是您的问题,但检查您的垃圾箱内容以确保没有任何空格是值得的。您可以使用物品的属性来确定目的地<代码>$item.getfolder.title