文章目录

  • 回收站和命令行操作
  • 查看回收站中的内容
  • 删除文件@移入回收站
  • 清空回收站
  • 恢复文件
  • windows的回收站
  • 不轻易使用rm 命令
  • 创建回收站文件夹


回收站和命令行操作

查看回收站中的内容

删除文件@移入回收站

  • PowerShell 中没有内置的命令可以直接把文件移动到回收站中。通常删除文件是使用 Remove-Item 命令,这会永久删除而非移动到回收站。但是,你可以使用一些额外的方法,例如调用 Windows API 或使用 Add-Type 来访问 Shell 的功能。
  • 以下是一个 PowerShell 函数,它使用了 Windows Shell 对象模型来模拟将文件移动到回收站中的效果:
function Move-ToRecycleBin
{
    <# 
    .SYNOPSIS
    模拟右键菜单中的“删除”动作,这会把文件或目录移动到回收站(考虑到命令行)
    .DESCRIPTION
    这里用的硬编码`delete`是系统界面为英文的情况;如果windows显示语言是中文,的需要改为删除(具体看自己系统右键菜单中的对应项)
    可以配置别名rm;这会代替掉powershell的默认别名(默认rm是remove-item)

    实现方式是模拟右键菜单中的“删除”动作,效率不高,一个备选的方案是
    另一个备选方案是在系统的某个位置建立一个文件夹,将其命名为“回收站”(Recycle或Trash),然后我们始终不用rm,而只使用mv(move-item)
    将需要放入回收站的文件或目录移动到这个文件夹
    然后这个目录就充当了回收站,定期清空即可(如果是磁盘做了分区,则跨磁盘或跨分区移动文件到回收站效率也不高
    而如果只有一个磁盘一个分区,可以用这个方案,并且这个方案安全高效)
    (通常为了方便起见,尽量少划分分区,许多操作的速度执行地会比较快;
    而且软件习惯把自己安装在C盘,干脆让系统只有一个C盘,或者保留一点空间给另一个磁盘而大部分空间划分个C盘)
    对于多个分区或者每个硬盘,为了保证移动操作执行速度,可以考虑每个分区分别设置一个回收站,这在使用上就不那么方便了

    #>
    param(
        # 参数名为 $path,要求在调用时必须提供,且位置索引为 0
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$path
    )

    # 检查提供的路径是否存在
    if (Test-Path $path)
    {
        # 尝试执行以下代码块
        try
        {
            # 引入需要的 .NET 组件,以便与 Windows Shell 对象模型交互
            Add-Type -AssemblyName Microsoft.VisualBasic
            Add-Type -AssemblyName System.Windows.Forms

            # 创建一个新的 Shell COM 对象实例
            $shell = New-Object -ComObject 'Shell.Application'

            # 获取路径指向的文件或目录的完整路径名,并通过 Shell Namespace 调用 ParseName 方法解析该路径
            $parsedPath = $shell.Namespace(0).ParseName((Get-Item $path).FullName)

            # 调用 InvokeVerb 方法,模拟右键菜单中的“删除”动作,这会把文件或目录移动到回收站
            $parsedPath.InvokeVerb('delete')
        }
        # 如果在尝试过程中发生错误,则捕获异常并输出错误信息
        catch
        {
            Write-Error -Message "An error occurred moving the item to the Recycle Bin: $_"
        }
    }
    else
    {
        # 如果提供的路径不存在,则输出错误信息
        Write-Error -Message "Path not found: $path"
    }
}
  • 要使用这个函数移动文件到回收站,你可以像这样调用它:
  • Move-ToRecycleBin -path "C:\path\to\your\file.txt"
  • 请确保在运行上述函数之前,路径正确且文件确实存在。如果文件已经删除,或者提供的是一个无效路径,函数将返回一个错误消息。
  • 这个脚本理论上应该在大多数Windows PowerShell环境中工作,但在运行时管理员权限可能是需要的,取决于文件的位置和访问权限。

清空回收站

恢复文件

  • 上面的函数可以将文件或目录移动到回收站
  • 然而恢复回收站中的文件建议操作GUI,使用powershell并不方便
  • 或者对于我们自己建立一个目录充当文件夹的情况,恢复起来就比较方便,毕竟是普通的文件操作行为

windows的回收站

  • Windows 的回收站实际上不是一个简单的文件夹,而是一个特殊的系统实现,用于管理已删除的文件和文件夹。在图形用户界面(GUI)中,回收站看起来像一个单一的实体,但在文件系统层面,回收站的数据存储更为复杂。这是因为系统需要处理不同磁盘分区和用户帐户的已删除文件。
  • Windows 系统通常将回收站中的文件存储在每个可移动驱动器或者分区的根目录下名为 $Recycle.Bin 的隐藏文件夹内。在旧版本的 Windows(如 XP)中,回收站的文件夹名称为 Recycler,而在更早的版本(如 Windows 95/98)中则称为 Recycled
  • 每个用户在系统上的已删除文件都会被放到他们专有的子文件夹中,这些子文件夹通常以用户的安全标识符(SID)命名。
  • 这样的设计允许每个用户只看到和管理自己的回收站内容,并且让操作系统能够容易地跟踪和管理不同磁盘上的已删除文件。
  • 由于这样的实现方式和安全隐患考虑,$Recycle.Bin 文件夹在正常视图下是隐藏的,需要显示隐藏文件才能看到,而且即使看到了也不推荐直接操作这个文件夹,以防发生数据丢失或者系统错误。
PS BAT [10:12:05 PM] [C:\]
[🔋 100%] MEM:69.64% [5.47/7.85] GB |ls -Force

        Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d--hs         1/16/2024   1:58 AM                  $360Section
d--hs         1/16/2024   7:45 PM                  $Recycle.Bin
d--h-         1/16/2024   7:39 PM                  $SysReset
[🔋 100%] MEM:57.06% [4.48/7.85] GB |ls -Force 'C:\$Recycle.Bin'

        Directory: C:\$Recycle.Bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d--hs          8/5/2023   8:16 PM                  S-1-5-18
d--hs          8/5/2023   5:54 PM                  S-1-5-21-1891471771-882250236-2783003205-1000
da-hs         2/22/2024  10:03 PM                  S-1-5-21-1891471771-882250236-2783003205-1001
d--hs         1/16/2024   7:45 PM                  S-1-5-21-1891471771-882250236-2783003205-1006

不轻易使用rm 命令

  • 有一天,我把mv(修改文件名的命令写成了rm)把重要文件给删除了(人裂开了)
  • 好吧,以后就像windows那样搞个回收站吧

创建回收站文件夹

  • 创建可见文件夹
mkdir ~/trash
mv litterFile ~/trash
	定期清理回收站:
	rm -rf ~/trash
  • 如果想要隐藏垃圾回收站,则可以用这一套方案
mkdir ~/.trash
mv litterFile ~/.trash
  • 定期清空回收站.
  • rm -rf ~/.trash