For loop 从一组文件中查找文件名(在CMD中)

For loop 从一组文件中查找文件名(在CMD中),for-loop,cmd,command-line,command,window,For Loop,Cmd,Command Line,Command,Window,我想使用Windows命令行在文件夹中查找视频文件名(它有1000个文件)。但是有一个问题,我不记得视频文件名,我有一些线索:视频是在2019/02/01到2019/05/31(格式:年/月/日)之间创建的,时间在09:00:00到13:00:00(格式:小时/分钟/秒) 此视频文件名的格式为:VID_YEARMONTHDAY_HOURMINUTESECOND.3gp,示例:VID_20190226_155112.3gp。有时视频文件名可能具有以下格式:VID_YEARMONTHDAY_HOUR

我想使用Windows命令行在文件夹中查找视频文件名(它有1000个文件)。但是有一个问题,我不记得视频文件名,我有一些线索:视频是在2019/02/012019/05/31(格式:年/月/日)之间创建的,时间在09:00:0013:00:00(格式:小时/分钟/秒)

此视频文件名的格式为:VID_YEARMONTHDAY_HOURMINUTESECOND.3gp,示例:VID_20190226_155112.3gp。有时视频文件名可能具有以下格式:VID_YEARMONTHDAY_HOURMINUTESECOND WORDS.3gp,例如:VID_20190226_155112 eEmplo1.3gp

我阅读了Microsoft文档中的for命令,并构建了以下内容:

for %A in (VID_201902* VID_201903* VID_201904* VID_201905*) do (for %B in (090000,1,130000) do (if %A:~0,19%==%A:~0,13%%B% echo %A%))
我不知道为什么它不起作用。我将解释代码:我从2月到5月获取一组文件,嵌套的for从090000到130000(它表示小时),然后我将实际文件名%a和文件名%a与小时%B进行比较,因为正如我所说的,我希望时间在09:00:00到13:00:00之间。最后,如果我的条件完成,我会显示视频文件名(%A)


我知道代码效率不高。我问:为什么代码不起作用?要找到所需的视频文件,我会采用完全不同的方法:

dir/B/A:-D“VID.*.3gp”| findstr/I/R/C:“^VID_20190[2-5][0-3][0-9](0-5][0-9][0-5][0-9]”/C:“^VID_20190[2-5][0-3][0-9][1[0-2][0-5][0-9][0-5][0-9]”/C:“^VID u 20190[2-5][0-3][0-9][0-13万”
返回所有文件(
/A:-D
),这些文件的名称以
VID\u
开头,以
.3gp
结尾,作为文件名的裸列表(
/B
),因此不输出额外信息。此列表位于中,其中定义了三个不区分大小写的(
/I
)搜索表达式(如正则表达式,
/R
,尽管
findstr
并不真正支持真正的正则表达式,但只支持它们的一小部分),所有这些表达式都包含文件名(
VID_
)的开头(
^
),指定的日期范围(2019年2月至5月),
\uu和:

  • 涵盖时间范围为09:00:00至09:59:59:
    ^VID_20190[2-5][0-3][0-9]_09[0-5][0-9][0-5][0-9]
  • 涵盖时间范围为10:00:00至12:59:59:
    ^VID_20190[2-5][0-3][0-9]_1[0-2][0-5][0-9][0-5][0-9]
  • 时间为13:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

关于你的代码:你把元变量和常态混淆了;前者看起来像
%A
%B
,不支持(像
~0,19
);后者类似于
%A%
%VAR%
,可以由定义,并且确实支持类似于
%VAR:~0,19%
的内容。顺便说一下,第二个循环应该是/L的

首先,我会稍微扩展一下,使用类似于
VID_201902???\u*.3gp
的东西,而不是
VID_201902*
,但这当然取决于实际可能出现的文件名

我还将减少要进行比较的字符串部分,因为左表达式和右表达式的前13个字符总是相等的,因此如果“%VAR:~14,6%”==“%B”
(我建议用于此字符串比较),则可以删除它们以获得

另一个问题是(090000,1130000)do
中/L%B的
090000
中的值,由于前导
0
,该值将被视为八进制值而不是十进制值(请参阅)。您可以改为声明
90000
,然后在需要时将前导零添加到
%B

由于/L的
循环必须对每个文件迭代40001次,因此您的代码会很慢。作为更好的选择,您可以对(9,1,13)do中的/L%B执行
,只需比较小时值,除非它是
13
,根据您的规范,只有
130000
是可接受的


在您的代码中,您正接近一个工作变量,但它缺少,这是在同一行或(括号内)代码块中写入和读取变量时所必需的

无论如何,要将以上所有内容放在一起,固定代码应该是这样的,因为命令提示符在之前已由
cmd/V:ON
启动,以便启用延迟扩展:

对于“VID_201902???u*.3gp”“VID_201903???u*.3gp”“VID_201904???u*.3gp”“VID_201905???u*.3gp”中的%A,do@(在(9,1,13)do@(设置“STR=%A”和/L%B)(设置“NUM=%B”和(if!NUM!lss 10设置“NUM=0!NUM!”)和if!NUM!lss 13(if!STR:~13,2!”echo:=“NUM=!else=!STR=!1300006/!STR!”)
在批处理脚本中,相同的代码如下所示:

@echo关闭
setlocal EnableDelayedExpansion
对于中的%%A(“VID_201902???u*.3gp”“VID_201903???u*.3gp”“VID_201904???u*.3gp”“VID_201905???u*.3gp”),请执行以下操作(
设置“STR=%%~A”
对于(9,1,13)do中的/L%%B(
设置“NUM=%%B”
如果!NUM!lss 10设置为“NUM=0!NUM!”
如果!NUM!lss 13(如果“!STR:~13,2!”==”!NUM!“echo/!STR!),否则如果“!STR:~13,6!”==“130000”echo/!STR!
)
)
端部

您将
元变量与正常环境变量混淆:前者看起来像
%A
%B
,不支持子字符串扩展(如
~0,19
);后者看起来像
%A%
%VAR%
,并且确实支持类似
%VAR:~0,19%
的东西。第二个循环应该是/L的
…另一个完全不同的方法是什么:
dir/B/a:-D“VID_*.3gp”;“findstr/I/R/C:“^VID_20190[2-5][0-3][0-9][0-09[0-5][0-9][0-9]”/C:“^VID u20190[2-5][0-3][0-9][0-9][1[0-3][0-5][0-9][0-9]”