这个特定的.cmd文件有什么作用?

时间:2016-11-13 09:41:23

标签: batch-file cmd

我需要有关此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

但为什么?

1 个答案:

答案 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 应输出包含Vv的所有行。

对于 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 命令行

  • 是为英文Windows而不是德语Windows写的 (在Windows区域设置中将德国选为国家/地区,将日期/时间输出格式确定为DD.MM.YYYY HH:MM)
  • 驱动器E的根目录:包含至少1个文件或目录,其中包含批处理代码编写器感兴趣的Vv
  • 按名称(按NTFS)和
  • 排序输出文件和目录
  • 输出是创建日期而不是上次修改日期。

所以命令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的所有文件/目录的创建日期和名称。