从回收站复制文件
copying files from recycle bin
在这里 (Listing files in recycle bin) 我找到了一个 @Smile4ever post 说如何获取文件在回收站中的原始位置:
(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:\Users\UserName\Desktop\recycleBinFiles.txt -NoTypeInformation
(gc C:\Users\UserName\Desktop\recycleBinFiles.txt | select -Skip 1)
| % {$_.Replace('"','')}
| set-content C:\Users\UserName\Desktop\recycleBinFiles.txt
我想将它们复制到某个地方(以防有人告诉我其中一些不能删除并且有人清空回收站)。
在这里 (https://superuser.com/questions/715673/batch-script-move-files-from-windows-recycle-bin) 我找到了一个 @gm2 post 用于复制它们
$shell = New-Object -ComObject Shell.Application
$recycleBin = $shell.Namespace(0xA) #Recycle Bin
$recycleBin.Items() | %{Copy-Item $_.Path ("C:\Temp\{0}" -f $_.Name)}
它们工作正常,但我需要更多。
我对 powershell 一无所知,但我想做的是:
为回收站中的每个文件在备份文件夹 C:\Temp 中创建其原始位置文件夹并将文件复制到那里(这样我就不会有更多同名文件的问题)。
然后压缩 C:\Temp.
有什么办法吗?
谢谢!
你应该可以这样做:
# Set a folder path INSIDE the C:\Temp folder to collect the files and folders
$outputPath = 'C:\Temp\RecycleBackup'
# 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://docs.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. \server\share --> 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 或更高版本,Compress-Archive
不可用。
要从 C:\Temp\RecycleBackup
创建 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 中使用它,例如 here
根据您上次在创建 zip 文件后删除 'RecycleBackup' 文件夹的请求
Remove-Item -Path $outputPath -Recurse -Force
希望对您有所帮助
在这里 (Listing files in recycle bin) 我找到了一个 @Smile4ever post 说如何获取文件在回收站中的原始位置:
(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:\Users\UserName\Desktop\recycleBinFiles.txt -NoTypeInformation
(gc C:\Users\UserName\Desktop\recycleBinFiles.txt | select -Skip 1)
| % {$_.Replace('"','')}
| set-content C:\Users\UserName\Desktop\recycleBinFiles.txt
我想将它们复制到某个地方(以防有人告诉我其中一些不能删除并且有人清空回收站)。
在这里 (https://superuser.com/questions/715673/batch-script-move-files-from-windows-recycle-bin) 我找到了一个 @gm2 post 用于复制它们
$shell = New-Object -ComObject Shell.Application
$recycleBin = $shell.Namespace(0xA) #Recycle Bin
$recycleBin.Items() | %{Copy-Item $_.Path ("C:\Temp\{0}" -f $_.Name)}
它们工作正常,但我需要更多。
我对 powershell 一无所知,但我想做的是: 为回收站中的每个文件在备份文件夹 C:\Temp 中创建其原始位置文件夹并将文件复制到那里(这样我就不会有更多同名文件的问题)。
然后压缩 C:\Temp.
有什么办法吗? 谢谢!
你应该可以这样做:
# Set a folder path INSIDE the C:\Temp folder to collect the files and folders
$outputPath = 'C:\Temp\RecycleBackup'
# 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://docs.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. \server\share --> 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 或更高版本,Compress-Archive
不可用。
要从 C:\Temp\RecycleBackup
创建 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 中使用它,例如 here
根据您上次在创建 zip 文件后删除 'RecycleBackup' 文件夹的请求
Remove-Item -Path $outputPath -Recurse -Force
希望对您有所帮助