返回不需要的文件列表结果的批处理脚本
Posted
技术标签:
【中文标题】返回不需要的文件列表结果的批处理脚本【英文标题】:Batch script returning unwanted file list results 【发布时间】:2022-01-03 08:24:10 【问题描述】:我有一个文件夹和许多包含视频的子文件夹。一个子文件夹名为 Screenshots,其文件夹结构反映了视频子文件夹。每个视频都有一个 jpg 截图:filename.ext.jpg。其中一些 jpg 文件不再需要,因为相应的视频已被删除。
d:\folder1 - video1.mp4 - video2.mkv d:\folder2 d:\folder3 d:\screenshots\folder1 - video1.mp4.jpg - video2.mkv.jpg d:\screenshots\folder2 d:\screenshots\folder3
我创建它是为了查找和删除过时的 jpg。它保存带有完整路径的屏幕截图列表,减去 .jpg,然后从路径中删除屏幕截图文件夹,从而生成视频文件的路径列表。
然后它应该返回所有不再存在的视频文件的列表它这样做,但也列出了许多仍然存在的文件。
正在寻找解决此问题的方法,或者寻找更聪明的方法来完成任务。
谢谢。
set screenshotlist="%temp%\screenshot_work\screenshots.txt"
set folder=D:\screenshots
mkdir %temp%\screenshot_work
:: get list of screenshots without .jpg extension
for /f "delims=" %%f in ('dir %folder% /s /a-d /b') do echo %%~dpnf >>%screenshotlist%
:: edit screenshots.txt, remove "screenshots\"
call jrepl "screenshots\\" "" /f %screenshotlist% /i /o -
:: check if files exist in D:\
for /f "usebackqdelims=" %%f in (%screenshotlist%) do (if not exist %%f echo %%f needs to be deleted)
rd /s /q %temp%\screenshot_work
pause
【问题讨论】:
所以每个视频都有一个截图文件,对吧?这个呢:for %%I in ("D:\root\screenshots\*.*.jpg") do set "FLAG=" & (for /D %%J in ("D:\root\*") do if exist "%%~J\%%~nI" set "FLAG=#") & if not defined FLAG ECHO del "%%~J"
?
我已经编辑了这个问题。每个视频一个屏幕截图,但视频位于子文件夹中,并且屏幕截图位于反映视频文件夹结构的子文件夹中。
好吧,如果截图放在子目录下,我需要调整一下我的建议:for /R "D:\root\screenshots" %%I in ("*.*.jpg") do set "FLAG=" & (for /D %%J in ("D:\root\*") do if /I not "%%~nxI"=="screenshots" if exist "%%~J\%%~nI" set "FLAG=#") & if not defined FLAG ECHO del "%%~J"
?
@aschipfl 我不得不删除 \root,脚本运行,但我得到这个输出:del "%~J"?
是的,只是为了向您展示如果您删除大写的ECHO
命令会被删除的内容以供验证...
【参考方案1】:
我理解您的问题的方式是您想删除 Screenshots 目录中的“.jpg”文件,这些文件在 Video 目录中没有相应的视频文件。相应的视频文件将是不带“.jpg”扩展名的屏幕截图的名称。
-
打开 PowerShell ISE
将代码粘贴到脚本窗格中
修改 $Video_Directory 和 $Screenshot_Directory
按播放
$Video_Directory = "C:\temp4\Video"
$Screenshot_Directory = "C:\temp4\Screenshot"
$Date = Get-Date -UFormat "%d %b %Y %H%M%S"
$Transcript_Directory = "C:\POSH_Transcripts"
$Transcript = "$Transcript_Directory\Transcript_$($Date)"
New-Item -ItemType "Directory" -Path $Transcript_Directory
Start-Transcript -Path $Transcript -Append
Get-ChildItem -Path $Screenshot_Directory -File -Recurse -Include "*.jpg" | ForEach-Object
$Video = $_.Name.Replace(".jpg", "")
If (Test-Path "$Video_Directory\$Video")
Write-Host -ForegroundColor Green "The video ($($_.Name.Replace(`".jpg`", `"`"))) for the screenshot ($($_.Name)) exists."
Else
Write-Host -ForegroundColor Red "The video for screenshot $($_.Name) does not exist. Removing screenshot."
Remove-Item $_.FullName -Force -Verbose
Write-Host -ForegroundColor Green "$($_.Name) has been removed"
Stop-Transcript
Start-Process notepad.exe $Transcript
【讨论】:
运行它并删除了所有屏幕截图。我正在从头开始创建所有屏幕截图,所以我不再需要脚本了。哈哈。感谢您提供帮助。 我不懂powershell,但我猜是因为我的文件夹是$Video_Directory = "D:\"
和$Screenshot_Directory = "D:\Screenshots"
您好,我在发送之前测试了我的脚本,它运行成功。很抱歉,它对您不起作用,但我的脚本使用风险自负,因为所有脚本都是通过互联网从无偿陌生人那里收到的。我建议尝试从回收站中恢复已删除的文件,它们是屏幕截图,因此文件不太可能被永久删除。如果它们被永久删除,则有免费软件可以恢复已永久删除的项目,因为永久删除意味着它们已从索引中删除。我将使用 (1/2) 重试脚本
您下班后提供的目录名称并解决任何问题。另外,脚本应该很冗长,你能提供一个成绩单吗?此外,许多 PowerShell cmdlet 都有一个名为“-whatif”的参数,它会告诉您它会在不实际执行的情况下尝试做什么。 (2/2)
对不起,如果我觉得我是指责或忘恩负义。文件没有放入回收站,它是一个没有一个外部驱动器。我考虑过恢复,但由于我想删除额外的文件,所以我发现一直重做它们更容易。但是,我将来需要再次这样做,所以我有兴趣让它发挥作用。 -whatif 非常有用,它可以让我更好地试验脚本和 Powershell。以上是关于返回不需要的文件列表结果的批处理脚本的主要内容,如果未能解决你的问题,请参考以下文章