如何使用Powershell/Node.js从回收站恢复指定或最近删除的文件
PowerShell 回收站文件恢复实现方案
完整可运行代码
function RestoreItems { [CmdletBinding()] param( # 待恢复的原始文件完整路径数组,匹配优先级最高 [Parameter()] [string[]]$Paths, # 恢复指定时间段内删除的文件,例:(New-TimeSpan -Minutes 5) 代表最近5分钟 [Parameter()] [TimeSpan]$DeletedWithin, # 恢复最近N条删除的条目 [Parameter()] [int]$LastCount ) # 初始化回收站COM对象 $recycleBin = (New-Object -ComObject Shell.Application).NameSpace(0x0a) # 读取所有回收站条目并提取所需属性 $allItems = $recycleBin.Items() | ForEach-Object { [PSCustomObject]@{ ComItem = $_ OriginalFullPath = Join-Path -Path $_.ExtendedProperty('System.Recycle.DeletedFrom') -ChildPath $_.Name DeletedTimestamp = [DateTime]$_.ExtendedProperty('System.Recycle.DateDeleted') } } # 按规则过滤条目 $filteredItems = $allItems # 优先按指定原始路径过滤 if ($Paths -and $Paths.Count -gt 0) { $filteredItems = $filteredItems | Where-Object { $Paths -contains $_.OriginalFullPath } } # 按删除时间段过滤 if ($DeletedWithin -ne $null) { $cutoffTime = (Get-Date).Add(-$DeletedWithin) $filteredItems = $filteredItems | Where-Object { $_.DeletedTimestamp -ge $cutoffTime } } # 按删除时间倒序,取最近N条 if ($LastCount -gt 0) { $filteredItems = $filteredItems | Sort-Object -Property DeletedTimestamp -Descending | Select-Object -First $LastCount } # 执行恢复操作,调用系统原生恢复逻辑,和手动右键恢复效果一致 foreach ($item in $filteredItems) { # 英文系统请将参数改为 'Restore' $item.ComItem.InvokeVerb('恢复') } # 返回恢复成功的条目信息供上层调用 return $filteredItems | Select-Object OriginalFullPath, DeletedTimestamp }
使用示例
1. 恢复指定路径的文件
RestoreItems -Paths @('C:\test\1.txt', 'C:\test\2\demo.png')
2. 恢复最近5分钟删除的所有文件
RestoreItems -DeletedWithin (New-TimeSpan -Minutes 5)
3. 恢复最近删除的10条条目
RestoreItems -LastCount 10
4. 组合条件使用(恢复指定路径下最近10分钟删除的文件)
RestoreItems -Paths @('C:\work\doc\report.docx') -DeletedWithin (New-TimeSpan -Minutes 10)
Electron 集成说明
在Electron中可以通过child_process模块调用上述PowerShell脚本,示例代码(Node.js):
const { exec } = require('child_process') // 示例:恢复最近5分钟删除的文件 const psFunction = `粘贴上面完整的RestoreItems函数内容` const runCommand = `RestoreItems -DeletedWithin (New-TimeSpan -Minutes 5)` const fullCommand = `powershell.exe -Command "${psFunction} ${runCommand}".replace(/"/g, '\\"')` exec(fullCommand, (err, stdout, stderr) => { if (err) { console.error('恢复失败:', err) return } console.log('恢复成功的条目:', stdout) })
注意事项
- 调用系统原生
InvokeVerb方法比手动复制文件更稳妥,会自动兼容回收站的原生逻辑,包括跨盘符恢复、目录自动重建、重名冲突系统提示等 - 不需要管理员权限,仅需当前用户的正常权限即可访问对应账号的回收站数据
- 过滤规则优先级为:指定路径 > 时间段 > 最近N条,多参数同时传入时会取交集
内容的提问来源于stack exchange,提问作者AlekseyHoffman
相关产品推荐
相关产品推荐

