[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[已解决][everything的高级搜索可完成]可选择的批量删除文件名中无特征的mp4或srt

本帖最后由 cl2039996 于 2022-4-4 21:12 编辑

大佬:

父文件夹下有许许多多子文件夹,子文件夹下有许许多多mp4和srt,他们的文件名规律如下:我仅摘取部分作为例子:
000001.mp4
000001.srt
000002.mp4
000002.srt
000003.mp4
000003.srt

经过某压制软件,我把srt字幕压制到mp4后,生成的新mp4的文件名比原来的mp4文件名多了字符串“_batch”,成为下面这样:
000001.mp4
000001.srt
000001_batch.mp4
000002.mp4
000002.srt
000002_batch.mp4
000003.mp4
000003.srt
000003_batch.mp4


您发现他们混在一起,这让我苦恼, 我目前的水平仅仅能用windows 的文件搜索功能搜索出所有包含“_batch”的mp4文件进行复制、剪切、或者删除。
可是,我如果想删除的是不含“_batch”的mp4文件们,也就是压制前的那些原mp4,他们都没有“_batch”字符串的特征,我就只能抓瞎了。

需求1:
您写一个bat,我放在父文件夹里,bat自动遍历所有子文件夹,对其中的混杂在一起的mp4文件们进行“辨别”,对比两种mp4,让bat发现压制后的mp4比压制前的mp4多出来“某某后缀”,比如上面的例子里,压制后的mp4比压制前的mp4多出“_batch”后缀。今后可能会用不同的压制软件压制mp4,压制出来的mp4后缀可能是“_x264” 、“_压制” 等等之类,而不是"_batch",那么把bat智能识别出来多出的后缀是“_x264”或“_压制”。反正,智能识别,得到”某某后缀“。

然后在屏幕上提示我:文件夹中发现存在不含“某某后缀”的mp4和含“某某后缀”的mp4文件;
接着要我选择:“若要删除所有不含“某某后缀”的mp4“,请按下1
“若要删除所有含有“某某后缀”的mp4们”,请按下2
此时我就能根据我的需要进行删除,有时候我需要删除不含“某某后缀”的mp4们,那我就按下1,bat开始批量仅仅删除不含“某某后缀”的mp4文件。
有时候我需要删除含有“某某后缀”的mp4们,那我就按下2,bat开始仅仅删除含有“某某后缀”的mp4们。
注意:此时文件内也有srt文件,千万不要删除srt文件。只针对mp4操作即可。


需求2:
其实与需求1非常相似,只不过这次专门针对srt文件。
我还是老老实实把过程写下:
比如:
父文件夹下有许许多多子文件夹,子文件夹下有许许多多mp4和srt,他们的文件名规律如下:我仅摘取部分作为例子:
000001.mp4
000001.srt
000002.mp4
000002.srt
000003.mp4
000003.srt

然后我制作了中文字幕后:
000001.mp4
000001.srt
000001.chs.srt
000002.mp4
000002.srt
000002.chs.srt
000003.mp4
000003.srt
000003.chs.srt

这个例子里面
我有可能要删除不含.chs的srt文件,我也有可能需要删除含有.chs的srt文件。今后不一定是.chs后缀,也许是".中英"或“.双语”之类的后缀。
您写一个另外的bat,我放在父文件夹里,bat自动遍历所有子文件夹,对其中的混杂在一起的srt文件们进行“辨别”,让bat智能发现:文件名长的srt比文件名短的srt多出了什么后缀,比如上面的例子就是:长文件名的srt比短文件名的srt多出了.chs. 那么.chs就是“某某后缀”。
然后在屏幕上提示我:文件夹中发现存在不含“某某后缀”的srt和含“某某后缀”的srt文件;
接着要我选择:“若要删除所有不含“某某后缀”的srt们”,请按下1
“若要删除所有含有“某某后缀”的srt们”,请按下2
注意:此时文件内也有mp4文件,千万不要删除mp4文件。只针对srt操作即可。

最后,我发现上面的例子有局限性,文件名不一定那么整齐都是6位的,有可能是下面这样的不整齐的文件名:
Biff and Chip - Series 1- 10. The Disco.mp4
Biff and Chip - Series 1- 10. The Disco.srt
Biff and Chip - Series 1- 10. The Disco_batch.mp4

Biff and Chip - Series 1- 11. Buried Treasure.mp4
Biff and Chip - Series 1- 11. Buried Treasure.srt
Biff and Chip - Series 1- 11. Buried Treasure_batch.mp4

Biff and Chip - Series 1- 12. Paradise Island.mp4
Biff and Chip - Series 1- 12. Paradise Island.srt
Biff and Chip - Series 1- 12. Paradise Island_batch.mp4

您发现3对儿文件的文件名长度都不一样。但是长文件名的mp4比短文件名的mp4多出来的"_batch"没问题的。
所以,请您把bat写的通用一些。

本帖最后由 zaqmlp 于 2022-4-4 20:32 编辑

这个起码40元
假设有
hi,jay.goodbye.srt
……
hi,jay.srt
那么会有问题,建议还是根据指定的可能出现的后缀列表去识别
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

可以用Everything软件:
  1. ::含_batch的mp4
  2. "要处理的目录" _batch.mp4
  3. ::不含_batch的mp4
  4. "要处理的目录" !_batch *.mp4
  5. ::含.chs的srt
  6. "要处理的目录" .chs *.srt
  7. ::不含.chs的srt
  8. "要处理的目录" !.chs *.srt
复制代码
2

评分人数

    • cl2039996: 非常感激技术 + 1
    • went: 感谢分享,还能这么用技术 + 1
如无特别说明,代码测试环境均为 XP SP3

TOP

本帖最后由 zaqmlp 于 2022-4-4 21:03 编辑

bat存为ANSI/GB2312编码
  1. <# :
  2. cls&echo off&cd /d "%~dp0"&mode con lines=5000
  3. set "current=%cd%"
  4. powershell -NoProfile -ExecutionPolicy bypass "[IO.File]::ReadAllText(\"%~f0\",[Text.Encoding]::GetEncoding('GB2312'))|Invoke-Expression"
  5. pause
  6. exit
  7. #>
  8. $srt_ext=@(".chs.srt",".中英.srt",".双语.srt");
  9. $mp4_ext=@("_batch.mp4","_x264.mp4","_压制.mp4");
  10. write-host '1、处理srt';
  11. write-host '2、处理mp4';
  12. $choice1='';
  13. while($choice1 -notmatch '^(1|2)$'){
  14.     $choice1=read-host '输入数字序号并回车';
  15. }
  16. $e=".srt";$arr=@($srt_ext|%{$_.ToLower()});$n=1;$ee=@{};
  17. if($choice1 -eq '2'){$e=".mp4";$arr=@($mp4_ext|%{$_.ToLower()});}
  18. $current=get-item -liter $env:current;
  19. $files=@(dir -literal $current.FullName -recurse|?{($e -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
  20. $dic=New-Object 'System.Collections.Generic.Dictionary[string, Object]';
  21. for($i=0;$i -lt $files.length;$i++){
  22.     $key=$e;
  23.     $fname=$files[$i].Name.ToLower();
  24.     for($j=0;$j -lt $arr.length;$j++){
  25.         if($fname.EndsWith($arr[$j])){
  26.             $key=$arr[$j];
  27.             break;
  28.         }
  29.     }
  30.     if(-not $dic.ContainsKey($key)){
  31.         [System.Collections.ArrayList]$brr=@();
  32.         $dic.add($key, $brr);
  33.         $ee.add($n.ToString(), $key);
  34.         $n++;
  35.     }
  36.     [void]$dic[$key].add($files[$i]);
  37. }
  38. write-host '选择删除类型';
  39. foreach($k in ($ee.Keys|sort)){
  40.     write-host ("{0}、{1}" -f $k,$ee[$k]);
  41. }
  42. $choice2=read-host '输入数字序号并回车';
  43. for($i=0;$i -lt $dic[$ee[$choice2]].count;$i++){
  44.     write-host ($dic[$ee[$choice2]][$i].FullName.SubString($current.FullName.length));
  45.     remove-item -literal $dic[$ee[$choice2]][$i].FullName -force -ErrorAction SilentlyContinue;
  46. }
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

本帖最后由 cl2039996 于 2022-4-4 21:15 编辑

回复 3# cutebe


    感激大佬, everything的高级搜索非常强大

TOP

回复 5# cl2039996


    那么为什么发有偿代写区,这不是让人白忙活吗
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 4# zaqmlp


    尊敬的Z大佬,您在2楼问题后,我以为您解决不了。        3楼坛友的Everything方法已经完全解决。  
现在您在4楼给出来代码,我虽然暂时用不上了,但是毕竟您付出时间和智慧了,我还是遵照您的要求您支付您40元。

TOP

返回列表