从回收箱复制文件



在此处(在回收箱中列出文件(我找到了一个 @Smile4ever帖子,说明如何获取Recycle Bin中的文件的原始位置:

(New-Object -ComObject Shell.Application).NameSpace(0x0a).Items()
|select @{n="OriginalLocation";e={$_.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871} 2")}},Name
| export-csv -delimiter "" -path C:UsersUserNameDesktoprecycleBinFiles.txt -NoTypeInformation
(gc C:UsersUserNameDesktoprecycleBinFiles.txt | select -Skip 1)
| % {$_.Replace('"','')}
| set-content C:UsersUserNameDesktoprecycleBinFiles.txt

我想在某个地方复制它们(如果我被告知其中有些不会被删除,有人空的回收箱(。

在这里
$shell = New-Object -ComObject Shell.Application  
$recycleBin = $shell.Namespace(0xA) #Recycle Bin  
$recycleBin.Items() | %{Copy-Item $_.Path ("C:Temp{0}" -f $_.Name)}   

他们工作正常,但是我需要更多的东西。

我对PowerShell一无所知,但是我想做的是:对于Recycle Bin中的每个文件,可以在备份文件夹C: temp中创建其原始位置文件夹并在此处复制文件(因此我不会有更多具有相同名称的文件的问题(。

,然后将c: temp。

拉链

有没有办法这样做?谢谢!

您应该能够这样做:

# Set a folder path INSIDE the C:Temp folder to collect the files and folders
$outputPath = 'C:TempRecycleBackup'
# afterwards, a zip file is created in 'C:Temp' with filename 'RecycleBackup.zip'
$shell = New-Object -ComObject Shell.Application  
$recycleBin = $shell.Namespace(0xA)
$recycleBin.Items() | ForEach-Object {
    # see https://learn.microsoft.com/en-us/windows/win32/shell/shellfolderitem-extendedproperty
    $originalPath = $_.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871} 2")
    # get the root disk from that original path
    $originalRoot = [System.IO.Path]::GetPathRoot($originalPath)
    # remove the root from the OriginalPath
    $newPath = $originalPath.Substring($originalRoot.Length)
    # change/remove the : and  characters in the root for output
    if ($originalRoot -like '?:*') {  
        # a local path.  X: --> X
        $newRoot = $originalRoot.Substring(0,1)
    }
    else {                             
        # UNC path.  \servershare --> server_share
        $newRoot = $originalRoot.Trim("") -replace '\', '_'   
        #""# you can remove this dummy comment to restore syntax highlighting in SO
    }
    $newPath = Join-Path -Path $outputPath -ChildPath "$newRoot$newPath"
    # if this new path does not exist yet, create it
    if (!(Test-Path -Path $newPath -PathType Container)) {
        New-Item -Path $newPath -ItemType Directory | Out-Null
    }
    # copy the file or folder with its original name to the new output path
    Copy-Item -Path $_.Path -Destination (Join-Path -Path $newPath -ChildPath $_.Name) -Force -Recurse
}
# clean up the Com object when done
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
$shell = $null

以下代码需要PowerShell版本5

# finally, create a zip file of this RecycleBackup folder and everything in it.
# append a '*' to the $outputPath variable to enable recursing the folder
$zipPath = Join-Path -Path $outputPath -ChildPath '*'
$zipFile = '{0}.zip' -f $outputPath.TrimEnd("")
#""# you can remove this dummy comment to restore syntax highlighting in SO
# remove the zip file if it already exists
if(Test-Path $zipFile -PathType Leaf) { Remove-item $zipFile -Force }
Compress-Archive -Path $zipPath -CompressionLevel Optimal -DestinationPath $zipFile -Force

在版本5

的PowerShell中创建一个ZIP文件

如果您没有PowerShell 5或UP,则Compress-Archive不可用。
要从C:TempRecycleBackup创建ZIP文件,您可以做到这一点:

$zipFile = '{0}.zip' -f $outputPath.TrimEnd("")
#""# you can remove this dummy comment to restore syntax highlighting in SO
# remove the zip file if it already exists
if(Test-Path $zipFile -PathType Leaf) { Remove-item $zipFile -Force }
Add-Type -AssemblyName 'System.IO.Compression.FileSystem'
[System.IO.Compression.ZipFile]::CreateFromDirectory($outputPath, $zipFile) 

当然,您也可以使用像7ZIP这样的第三方软件。网上有很多示例如何在powershell中使用它,例如在这里

根据您的最后一个请求,以在创建ZIP之后删除" RecycleBackup"文件夹

Remove-Item -Path $outputPath -Recurse -Force

希望有帮助

相关内容

  • 没有找到相关文章

最新更新