返回不需要的文件列表结果的批处理脚本

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。

以上是关于返回不需要的文件列表结果的批处理脚本的主要内容,如果未能解决你的问题,请参考以下文章

DOS 批处理文件 ping脚本返回时间

如何在批处理脚本中查找 m3u 播放列表文件大小?

在.bat脚本中如何将一个命令的返回结果传给一个变量?

当文件名与模式列表不匹配时,批处理脚本删除文件

BAT 批处理脚本教程

BAT自动批处理写一个脚本查找指定软件安装目录并启动软件