xxhk.org

学习骇客

Windows 11 一键整理文件

2024 / 9 / 19

在资源管理器的地址栏里输入“PowerShell”,一键打开终端并定位到当前目录。这个输入过程也可以通过输入法的常用语简化。

整理到当前文件夹下

粘贴以下命令到 PowerShell 中,然后按下回车键执行命令。当然,这个命令也可以通过输入法的常用语快速输入。

# 获取当前年份和月份,例如 "24年09月" $currentYearMonth = (Get-Date).ToString("yy年MM月") # 定义整理的根目录 $rootDir = Join-Path (Get-Location) "PS整理文件夹" # 处理文件:按后缀分类并移动到目标文件夹中 Get-ChildItem -File | ForEach-Object { $file = $_ # 获取文件的扩展名(不包含点),如果没有扩展名则跳过 $extension = $file.Extension.TrimStart('.').ToLower() if ([string]::IsNullOrEmpty($extension)) { return } # 定义目标文件夹路径,例如 ".\PS整理文件夹\exe\24年09月" $targetDir = Join-Path $rootDir $extension $targetYearMonthDir = Join-Path $targetDir $currentYearMonth # 如果目标文件夹不存在,则创建 if (-not (Test-Path -Path $targetYearMonthDir)) { New-Item -Path $targetYearMonthDir -ItemType Directory -Force | Out-Null } # 移动文件到目标文件夹 Move-Item -Path $file.FullName -Destination $targetYearMonthDir } # 处理文件夹:将非目标文件夹集中移动到名为“文件夹”的目录下 Get-ChildItem -Directory | Where-Object { # 排除已经作为目标的后缀文件夹和名为“PS整理文件夹”的文件夹 $_.Name -notin (Get-ChildItem -File | ForEach-Object { $_.Extension.TrimStart('.').ToLower() }) -and $_.Name -ne "PS整理文件夹" } | ForEach-Object { $folder = $_ # 定义目标文件夹路径为 ".\PS整理文件夹\文件夹\24年09月" $targetDir = Join-Path $rootDir "文件夹" $targetYearMonthDir = Join-Path $targetDir $currentYearMonth # 如果目标文件夹不存在,则创建 if (-not (Test-Path -Path $targetYearMonthDir)) { New-Item -Path $targetYearMonthDir -ItemType Directory -Force | Out-Null } # 移动文件夹到目标文件夹 Move-Item -Path $folder.FullName -Destination $targetYearMonthDir } Write-Output "文件和文件夹已按后缀和年月整理完毕。"

执行完成后,文件会按后缀名自动整理到对应的文件夹里,文件夹里还会按月份再细分不同的版本。

整理到目标文件夹下

修改D:\BaiduNetdiskWorkspace\PS-Backup为自己的目标文件夹,就可以一键集中整理到指定的文件夹里了。

# 获取当前年份和月份,例如 "24年09月" $currentYearMonth = (Get-Date).ToString("yy年MM月") # 定义目标整理文件夹路径为 "D:\BaiduNetdiskWorkspace\PS-Backup" $rootDir = "D:\BaiduNetdiskWorkspace\PS-Backup" # 处理文件:按后缀分类并移动到目标文件夹中 Get-ChildItem -File | ForEach-Object { $file = $_ # 获取文件的扩展名(不包含点),如果没有扩展名则跳过 $extension = $file.Extension.TrimStart('.').ToLower() if ([string]::IsNullOrEmpty($extension)) { return } # 定义目标文件夹路径,例如 "D:\BaiduNetdiskWorkspace\PS-Backup\exe\24年09月" $targetDir = Join-Path $rootDir $extension $targetYearMonthDir = Join-Path $targetDir $currentYearMonth # 如果目标文件夹不存在,则创建 if (-not (Test-Path -Path $targetYearMonthDir)) { New-Item -Path $targetYearMonthDir -ItemType Directory -Force | Out-Null } # 移动文件到目标文件夹 Move-Item -Path $file.FullName -Destination $targetYearMonthDir } # 处理文件夹:将非目标文件夹集中移动到名为“文件夹”的目录下 Get-ChildItem -Directory | Where-Object { # 排除已经作为目标的后缀文件夹和名为“PS-Backup”的文件夹 $_.Name -notin (Get-ChildItem -File | ForEach-Object { $_.Extension.TrimStart('.').ToLower() }) -and $_.Name -ne "PS-Backup" } | ForEach-Object { $folder = $_ # 定义目标文件夹路径为 "D:\BaiduNetdiskWorkspace\PS-Backup\文件夹\24年09月" $targetDir = Join-Path $rootDir "文件夹" $targetYearMonthDir = Join-Path $targetDir $currentYearMonth # 如果目标文件夹不存在,则创建 if (-not (Test-Path -Path $targetYearMonthDir)) { New-Item -Path $targetYearMonthDir -ItemType Directory -Force | Out-Null } # 移动文件夹到目标文件夹 Move-Item -Path $folder.FullName -Destination $targetYearMonthDir } Write-Output "文件和文件夹已按后缀和年月整理完毕。"

反向提取

将当前文件夹下所有子文件夹里的文件全部提取到当前文件夹下,并删除剩余的空的子文件夹。此方法适用于快速查找文件,但同时也会让原本以文件夹组织的一套文件失去原有的结构。

# 获取当前目录 $currentDir = Get-Location # 递归遍历所有子文件夹中的文件并提取到当前文件夹 Get-ChildItem -Recurse -File | ForEach-Object { $file = $_ # 定义目标路径为当前文件夹 $targetPath = Join-Path $currentDir $file.Name # 如果目标路径不存在或者同名文件不存在,则移动文件 if (-not (Test-Path -Path $targetPath)) { Move-Item -Path $file.FullName -Destination $targetPath } else { # 如果存在同名文件,给文件添加一个序号以避免冲突 $counter = 1 $newFileName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name) $extension = [System.IO.Path]::GetExtension($file.Name) while (Test-Path -Path (Join-Path $currentDir "$newFileName($counter)$extension")) { $counter++ } $newFilePath = Join-Path $currentDir "$newFileName($counter)$extension" Move-Item -Path $file.FullName -Destination $newFilePath } } # 递归删除空文件夹,从最深层开始删除 Get-ChildItem -Recurse -Directory | Sort-Object FullName -Descending | ForEach-Object { $folder = $_ # 如果文件夹为空,则删除 if (-not (Get-ChildItem -Path $folder.FullName -Recurse)) { Remove-Item -Path $folder.FullName -Force } } Write-Output "所有文件已从子文件夹提取到当前文件夹,并且原有的空文件夹已删除。"