我需要有关此cmd文件的帮助,其中包含以下内容:
@echo off
for /f "tokens=1,4 delims= " %%a in ('dir e:\ /t:c^|findstr /i /l "v"') do echo %%a %%b
echo on
pause
我无法弄清楚它的作用。
有人能帮助我吗?
我知道输出,但我不知道为什么它会给我这个输出。
这是输出。我最初不想发布它,因为我的Windows是德语,抱歉:
Datenträger in Laufwerk E: ist Volume
Volumeseriennummer: 1AB8-6911
Verzeichnis von e:\
22.09.2015 09:09 0 282ba90118a5f80716
06.10.2015 09:07 0 32f0961d6cc71b3c51bdc6
06.10.2015 09:07 0 4f1ab9edc5ed58c95f344fd2bc84a6ec
02.02.2016 10:56 <DIR> ada200fdfcff43bdf47cf363ddf8
22.09.2015 09:08 <DIR> Besitzer
06.10.2015 09:07 0 bf5f62260169474da0ec9df993590745
06.10.2015 09:07 0 de9afd1afa67ed193d0adb16010b54
10.10.2016 20:29 <DIR> ImportAfter
01.12.2006 22:37 904.704 msdia80.dll
03.10.2016 15:27 <DIR> myxampp
08.09.2015 16:20 <DIR> Schule
08.09.2015 16:20 <DIR> Spiele
6 Datei(en), 904.704 Bytes
6 Verzeichnis(se), 865.948.643.328 Bytes frei
.cmd文件给出了这个输出:
Datenträger E:
Volumeseriennummer:
Verzeichnis
6 Bytes
但为什么?
答案 0 :(得分:1)
我按行执行顺序解释批处理代码命令:
for /f "tokens=1,4 delims= " %%a in ('dir e:\ /t:c^|findstr /i /l "v"') do echo %%a %%b
首先执行的命令是:
dir e:\ /t:c
此命令根据在命令提示符窗口dir /?
中运行的帮助输出输出驱动器E的根目录中的文件和目录:显示由于/t:c
而不是上次修改的创建日期默认为日期。
文件和目录在NTFS(新技术文件系统)格式化的驱动器上输出,按字母顺序排序,因为NTFS执行那种在这里很重要的排序。
在FAT16,FAT32和exFAT驱动器上,文件和目录将按照存储在File Allocation Table(FAT)中的未排序列出。因此,还需要使用 DIR 参数/O:N
来获取按文件系统独立的任何驱动器的名称排序列表。
写入 STDOUT 的命令 DIR 的输出会重定向到控制台应用程序 FINDSTR 的 STDIN ,以便进一步处理使用管道重定向操作符|
。有关详细信息,请参阅Microsoft TechNet文章Using command redirection operators。
|
解释为重定向运算符
dir e:\ /t:c | findstr /i /l "v"
通过命令 FOR 完成。
要实现这一点,必须通过放置|
来逃避^
。解析命令行的命令解释器cmd.exe
现在将|
解释为文字字符,而不是因为^
之前的重定向操作符。
如果在 FOR 命令行中仅使用|
而不是^|
,则Windows命令解释程序将退出该行上的批处理文件的执行,因为语法错误,因为重定向运算符|
在 FOR 命令行的中间无效。错误消息将分别在德语英语Windows上:
英语:|这时出人意料 德语:“|” ist syntaktisch and dieser Stelle nicht verarbeitbar。
在命令提示符窗口findstr /?
中运行会输出此标准Windows控制台应用程序的帮助。 /i
的使用使搜索不区分大小写。 /l
告诉 FINDSTR 将搜索字符串"v"
解释为文字字符串而不是正则表达式。因此 FINDSTR 应输出包含V
或v
的所有行。
对于 DIR 的发布输出,这意味着 FINDSTR 输出:
Datenträger in Laufwerk E: ist Volume
Volumeseriennummer: 1AB8-6911
Verzeichnis von e:\
6 Verzeichnis(se), 865.948.643.328 Bytes frei
FINDSTR 过滤的命令 DIR 的输出接下来逐行处理 FOR 。
FOR 参数"tokens=1,4 delims= "
,如在命令提示符窗口中运行for /?
的帮助输出中所述,导致使用空格字符作为分隔符将每一行拆分为多个字符串对于琴弦。
第一个字符串应分配给循环变量a
,如 FOR 命令行中指定的那样。
根据ASCII table,第四个字符串应分配给b
的下一个循环变量。
循环变量区分大小写,因为此功能可以将多个字符串分配给多个循环变量。
所有其他空格分隔的字符串都不重要,因此被忽略。
通过命令 FOR 进行额外的行过滤会产生输出:
Datenträger E:
Volumeseriennummer:
Verzeichnis
6 Bytes
但现在很清楚,这个输出不是代码原来设计的。
出于这个原因,让我们假设 FOR 命令行
V
或v
,所以命令dir e:\ /t:c
输出:
Volume in drive E is
Volume Serial Number is 1AB8-6911
Directory of e:\
22.09.2015 09:09 0 282ba90118a5f80716
06.10.2015 09:07 0 32f0961d6cc71b3c51bdc6
06.10.2015 09:07 0 4f1ab9edc5ed58c95f344fd2bc84a6ec
02.02.2016 10:56 <DIR> ada200fdfcff43bdf47cf363ddf8
22.09.2015 09:08 <DIR> Besitzer
06.10.2015 09:07 0 bf5f62260169474da0ec9df993590745
06.10.2015 09:07 0 de9afd1afa67ed193d0adb16010b54
10.10.2016 20:29 <DIR> ImportAfter
01.12.2006 22:37 904.704 msdia80.dll
03.10.2016 15:27 <DIR> myxampp
08.09.2015 16:20 <DIR> Schule
08.09.2015 16:20 <DIR> Spiele
13.11.2016 12:53 <DIR> VeryImportantDirectory
6 File(s) 904.704 bytes
7 Dir(s) 865.948.639.232 bytes frei
使用findstr /i /l "v"
过滤的此输出为:
Volume in drive E is
Volume Serial Number is 1AB8-6911
13.11.2016 12:53 <DIR> VeryImportantDirectory
然后通过命令 FOR 过滤这3行,输出:
Volume E
Volume is
13.11.2016 VeryImportantDirectory
可以假设前两行不是真正感兴趣的,最后一行是原始批处理代码编写者真正感兴趣的内容。
批量代码很可能是为获取输出而编写的:
在任何情况下包含v
的所有文件/目录的创建日期和名称。