我需要从$ Recycle.bin中恢复40000多个项目

时间:2017-07-27 19:11:01

标签: 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 - 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
}

感谢。

2 个答案:

答案 0 :(得分:2)

您正在使用未命名的位置参数。 Move-Item将位置0的参数作为Path参数,该参数受shell散列影响。

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

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

答案 1 :(得分:0)

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

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

 }

我发现也缺少DACL项目。然后我添加了以下内容:

$permissoes = Get-Acl $item.Path -Verbose
Move-Item -LiteralPath $item.Path -Destination $CaminhoCompleto -Verbose -ErrorVariable +Err     
Set-Acl -Path $CaminhoCompleto -AclObject $permissoes -Verbose