window的dos命令学习笔记 四

不羁岁月 提交于 2020-02-01 08:26:34

一、dos历史学习笔记

window的dos命令学习笔记 一

window的dos命令学习笔记 二

window的dos命令学习笔记 三

二、语句结构:

类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。
今天开始学习一下语句结构。

1、if条件语句(选择结构)

if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能。

官方说明:

E:\000dos\4笔记四>if /?
执行批处理程序中的条件处理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  NOT               指定只有条件为 false 的情况下,Windows 才
                    应该执行该命令。

  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                    指定数字的退出代码,指定条件为 true。

  string1==string2  如果指定的文字字符串匹配,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

  command           如果符合条件,指定要执行的命令。如果指定的
                    条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                    在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

由于 del 命令需要用新的一行终止,因此以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

如果命令扩展被启用,IF 会如下改变:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command

其中, compare-op 可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

而 /I 参数(如果指定)说明要进行的字符串比较不分大小写。
/I 参数可以用于 IF 的 string1==string2 的形式上。这些
比较都是通用的;原因是,如果 string1 和 string2 都是
由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
是在跟与命令扩展有关联的内部版本号比较。第一个版本
是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。
命令扩展被停用时,CMDEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,
除了它取得一个环境变量,返回的结果是 true。

如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%
会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到
其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

你也可以使用以上的数字比较:

    IF %ERRORLEVEL% LEQ 1 goto okay

如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始
命令行;否则,你会得到其数值。

如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式;否则,你会得到其数值。

示例:

if else语句的俩种写法:

法一:俩行(else和if各一行)

IF EXIST filename. del filename.
ELSE echo filename. missing

发二:如果都放在同一行上,以下子句有效:(if成功之后,后面的语句用括号括起来,如果里面多个批命令,还是分开各占一行执行,不然还是报错。)

IF EXIST filename. (del filename.) ELSE echo filename. missing

1)、字符串比较

if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。其命令格式为:

IF [/I] [not] string1 compare-op string2 command1 [else command2]

其中,比较操作符compare-op有以下几类:

== - 等于
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于

选择参数/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。
字符串比较示例:

1、获取日期和时间的字符

E:\000dos\4笔记四>echo %date%
2019/12/17 周二

E:\000dos\4笔记四>echo %time%
10:55:14.26

2、pause 和 pause>nul的区别
pause 等待并显示汉字:请按任意键继续. . .
pause>nul等待不显示任何汉字。


E:\000dos\4笔记四>pause>nul

E:\000dos\4笔记四>pause
请按任意键继续. . .

3、字符串的比较(字符串是从第一个字符的大小依次往后开始比较):

敲入代码:

@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

set str3=Zabcd12334
set str4=ABCD1234
if /i %str3% LSS %str4% (echo %str3%^<%str4%) else (echo %str3%^>=%str4%)
echo.
set /p choice=是否显示当前时间?(y/n)
if /i not %choice% EQU n echo 当前时间是:%date% %time%
pause

执行结果:
在这里插入图片描述

4、数字的比较

代码:

@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

set str3=12334
set str4=1234
if  %str3% LSS %str4% (echo %str3%^<%str4%) else (echo %str3%^>=%str4%)
echo.
set /p choice=是否显示当前时间?(y/n)
if /i not %choice% EQU n echo 当前时间是:%date% %time%
pause

执行效果:
在这里插入图片描述
5、忽略字符串大小写:
代码:

@echo off
set str1=abcd1234
set str2=ABCD1234
if /i %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
pause

执行结果:
在这里插入图片描述

2)、存在判断

存在判断的功能是判断文件或文件夹是否存在。其命令格式为:
这个我感觉可以用来做一些批量删除文件和文件夹或者创建文件夹时使用,md、del、结合执行效果比较好。

IF [NOT] EXIST filename command1 [else command2]

1、判断执行的文件是否存在:

@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (echo 文件夹%~df0不存在!)  else  (echo 文件夹%~df0存在!)
pause>nul

这里注意几个地方:

  1. 存在判断既可以判断文件也可以判断文件夹;
  2. %0即代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型);
  3. %~df0是对%0的修正,只保留了其驱动器盘符和路径,详情请参考for /?,属高级批处理范畴;
  4. 注意if语句的多行书写,多行书写要求command1的左括号必须和if在同一行、else必须和command1的右括号同行、command2的左括号必须与else同行、command1和command2都可以有任意多行,即command可以是命令集。

3)、定义判断

定义判断的功能是判断变量是否存在,即是否已被定义。其命令格式为:

IF [not] DEFINED variable command1 [else command2]

存在判断举例:

@echo off
set var=111
if defined var (echo var=%var%) else (echo var尚未定义!)
set var=
if defined var (echo var=%var%) else echo var尚未定义!
pause

执行结果:
在这里插入图片描述
对比可知,"set var="可以取消变量,收回变量所占据的内存空间。

4)、使用if写一个成绩分类

当然,这个成绩分类使用python和shell都可以很简单写出来,我就献丑了。

代码:
写了好久,总数写出来了,主要还是语法有区别,比如我吧
(%score% LSS 0) & (%score% GTR 100)放在一起,却给我提示没有识别&,不知道什么鬼,只能后面慢慢学习了。

@echo off
set /p score=请输入成绩
rem 用来判断是否格式正确
if %score% LSS 0 (
echo "输入的成绩分数不对(分数0-100之间)" 
pause
call exit
) 

if %score% GTR 100 (
echo "输入的成绩分数不对(分数0-100之间)" 
pause
call exit
) 

if %score% GTR 90 (
echo "优秀" 
call pause
call exit
)

if %score% GTR 80 (
echo "良好" 
call pause
call exit
)

if %score% GTR 70 (
echo "中等" 
call pause
call exit
)

if %score% GTR 60 (
echo "及格" 
call pause
call exit
)
if (%score% LSS 60) (
echo "不及格" 
call pause
call exit
)

注意点:

  1. if成功之后,后面的小括号里面的语句,必须单个命令占一行,我也是尝试好多次才发现这样才能运行多个语句,我想用&&连在一起却不行,至于原因我也不知道,有懂的欢迎下方留言指教指教。
  2. 直接执行exit 不会退出,还会接着往下执行,需要加call。比如:call exit。我发现pause和exit如果想一起用目前我只到就只能这样用,单写一个是可以的,pause可以不加call是没有问题的,但是退出的exit必须加上call。

5)、优化下成绩分类

不知道看到我这里你有没有想到一个优化我的第四个代码,就是如果小于0或者大于100时直接退出,如何写一个循环,让再次输入,这个是个很好思路,第一次我想到是python的while True(受python的影响,但是dos可没有找到这个命令),后来想到goto,不知道看到这里你还有没有印象,有的话自己去看看我的之前博客写的goto的用法。

优化的代码:

@echo off
:return1
set score=
set /p score=请输入成绩
rem 用来判断是否格式正确
if %score% LSS 0 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 100 (
echo "输入的成绩分数不对:%score%(分数0-100之间),请再次输入:" 
goto return1
) 
if %score% GTR 90 (
echo "优秀" 
call pause
call exit
)

if %score% GTR 80 (
echo "良好" 
call pause
call exit
)

if %score% GTR 70 (
echo "中等" 
pause
call exit
)

if %score% GTR 60 (
echo "及格" 
call pause
call exit
)
if (%score% LSS 60) (
echo "不及格" 
call pause
call exit
)

执行效果:

在这里插入图片描述

这里我又遇到一个问题,就是前面判断是否小于0或者大于100的时候,前面语句带小括号会出问题,但是下面的用来判断小于60不及格的时候,里面语句写的小括号却没有问题,不知道是不是和goto有关。有懂的欢迎下面留留言讨论。

2、for循环(很重要)

for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的参数可以实现更多的功能。for语句有多个参数,不同参数将会实现不同的功能。

官方帮助文档:

E:\000dos\4笔记四>for /?
对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

如果启用命令扩展,则会支持下列 FOR 命令的其他格式:

FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
    如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
    则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
    1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
    每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
    然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
    以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
    你可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
    或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和制表符的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 file-set
                          中使用双引号扩起文件名称。

    某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
    每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或
    空格分隔符号。请注意,此 for 函数体的语句引用 %i 来
    获得第二个符号,引用 %j 来获得第三个符号,引用 %k
    来获得第三个符号后的所有剩余符号。对于带有空格的文件
    名,你需要用双引号将文件名括起来。为了用这种方式来使
    用双引号,还需要使用 usebackq 选项,否则,双引号会
    被理解成是用作定义某个要分析的字符串的。

    %i 在 for 语句中显式声明,%j 和 %k 是通过
    tokens= 选项隐式声明的。可以通过 tokens= 一行
    指定最多 26 个符号,只要不试图声明一个高于字母 "z""Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;
    而且,不能同时使用超过 52 个。

    还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,
    用单引号将括号之间的 file-set 括起来。这样,该字符
    串会被当作一个文件中的一个单一输入行进行解析。

    最后,可以用 FOR /F 命令来分析命令的输出。方法是,将
    括号之间的 file-set 变成一个反括字符串。该字符串会
    被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到
    内存中,并被当作文件分析。如以下例子所示:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。你现在可以使用下列
选项语法:

     %~I          - 删除任何引号("),扩展 %I
     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩展到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
     %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

0)、for语句中的几种分隔符形式

其实for /l %i in (1,1,99) do @echo %i 括号中间的分隔号有多种形式如下:

for /l %i in (1,1,99) do @echo %i

for /l %i in (1 1 99) do @echo %i

for /l %i in (1;1;99) do @echo %i

for /l %i in (1=1=99) do @echo %i

都是打印出1到99。

1)、无参数

无参数的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

FOR %%variable IN (set) DO command

其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

无参数for语句举例:

@echo off
for %%i in (你,好,呀) do echo %%i
pause

执行结果:
在这里插入图片描述

2)、参数/L

含参数/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

FOR /L %%variable IN (start,step,end) DO command

1、其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
2、该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列 1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

示例:
含参数/L的for语句举例(创建5个文件夹):

@echo off
for /l %%i in (1,2,10) do md demo%%i
pause

执行之后:
在这里插入图片描述
在这里插入图片描述

上例将新建5个文件夹,文件夹名称依次为demo1、demo3、demo5、demo7、demo9。可以发现,%%i的结束值并非end的值10,而是不大于end的一个数。

3)、参数/F

含参数/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:

FOR /F ["options"] %%variable IN (set) DO command

其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。

含参数/F的for语句举例:

  1. 分开执行
@echo off
echo **No Options:
for /f %%a in ("1,4,7") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("2,5,8") do echo a=%%a b=%%b c=%%c
pause

执行结果:
在这里插入图片描述

  1. 打印当前目录下的所有文件。

代码:

@echo off
echo 本文件夹里面的文件有:
for /f "skip=5 tokens=3,4 delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo     %%b
)
pause

执行结果:
在这里插入图片描述

  1. 将当前目录下的文件信息写入到指定文件E:\000dos\for1.txt
@echo off
echo 本文件夹里面的文件有:
>E:\000dos\for1.txt dir
for /f "skip=5 tokens=3,4 delims= " %%a in (E:\000dos\for1.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo     %%b
)

pause

执行之后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F参数系统就将delims的值默认为空格。
同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。

4)、参数/D或/R

含参数/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含参数/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,故而列举此例。

1. 含参数/R的for语句举例(文件夹遍历):

@echo off
setlocal enabledelayedexpansion
FOR /R e: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit

运行效果:
**注意点:**这个不能再相同磁盘运行,不然运行不了。比如我这里查询E盘,我是复制到d盘执行才可以。
在这里插入图片描述

上例即可以罗列出D盘下的所有文件夹,其速度要比命令"tree d:"慢多了,不过其返回结果的实用性则远远超过了tree命令。
一般情况下我们不推荐通过遍历文件夹来查找文件,特别是在查找某些程序(比如QQ.exe)的位置时。推荐通过reg命令查找注册表来查找QQ的路径,以保证查找效率。
上例中也出现了几个新面孔,如setlocal、感叹号等。其中,感叹号其实就是变量百分号(%)的强化版。之所以要用!而不用%,是因为在for循环中,当一个变量被多次赋值时,%dd%所获取的仅仅是dd第一次被赋予的值;要想刷新dd的值,就必须首先通过命令"setlocal enabledelayedexpansion"来开启延迟变量开关,然后用!dd!来获取dd的值。

5)、强化学习for的用法:

简单说,FOR是个循环,可以用你指定的循环范围生成一系列命令。最简单的例子,就是人工指定循环范围,然后对每个值执行指定的命令。
这些还不是FOR最强大的功能。我认为它最强大的功能,表现在以下这些高级应用:

  1. 可以用 /r 参数遍历整个目录树

  2. 可以用 /f 参数将文本文件内容作为循环范围

  3. 可以用 /f 参数将某一命令执行结果作为循环范围

  4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分

更多学习示例:

<1>、想快速报告每个硬盘分区的剩余空间:
for %a in (c: d: e:) do @dir %a\ |find "可用字节"

在这里插入图片描述
我们以磁盘计算:最后的剩余是19.18G空间
在这里插入图片描述
在这里插入图片描述

<2>、查看当前目录下的bat文件内容:

代码:

for %a in (*.bat) do type %a

在这里插入图片描述

<3>、 用 /r 遍历目录树 :

当用 *.**.txt 等文件名通配符作为 for /r 的循环范围时,可以对当前目录下所有文件(包括子目录里面的文件)进行操作。举个例子,你想在当前目录的所有bat文件(包括子目录)内容中查找"pause"字样,但由于find本身不能遍历子目录,所以我们用for:

for /r . %a in (*.bat) do @find "pause" %a

在这里插入图片描述
把上面命令改改更能直观,其实这个应该是for的命令里面加上/r就是个递归的查询。
在这里插入图片描述

find 前面的 @ 只是让输出结果不包括 find 命令本身。这是DOS很早就有的功能。和FOR无关。

当用 . 作为循环范围时,for 只将子目录的结构(目录名)作为循环范围,而不包括里面的文件。有点象 TREE 命令,不过侧重点不同。TREE 的重点是用很漂亮易读的格式输出,而FOR的输出适合一些自动任务,例如,我们都知道用deep管理的项目中,每个子目录下都会有一个deep目录,有时在软件发行时我们想把这些deep目录全部去掉(deep这里只是一个代指):
在这里插入图片描述
然后执行命令:

for /r . %a in (.) do @if exist %a\deep rd /s /q %a\deep

在这里插入图片描述
在这里插入图片描述
可以看到,deep目录以及删除,如果需要删除一个目录下或者它的子目录下的一个目录,可以用这个方法,当然,如果删除文件,可以使用刚刚的方法,只不过修改简单的代码即可。
如果不太理解,我这里把随意的变量a打印出来就懂了:
在这里插入图片描述
每个a就是所有的目录。甚至通过这个方法可以获取所有目录,如果我想要一个目录下的所有目录都复制过去一个文件都是可以的。
我这里说下我的大概思路:

  1. 打印出所有目录
  2. 使用if exist file
  3. 判断是否需要复制。

算了,我还是写个简单例子吧:

for /r . %a in (.) do @if not exist %a\name.txt copy e:\000dos\name.txt %a

在这里插入图片描述
执行之后,每个文件夹都有一个name.txt文件。

<4>、将某一文件内容或命令执行结果作为循环范围 :

假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。假设这个文件是每个文件名占一行,象这样:

c:\temp\a1.txt

c:\temp\a2.txt

c:\temp\subdir\b3.txt

c:\temp\subdir\b4.txt

那么可以用FOR来完成:

for /f %a in (todel.txt) do del %a 
<5>、将某一文件内容选取第几列使用 :

这个命令还可以更强大。比如你的 todel.txt 并不是象上面例子那么干净,而是由DIR直接生成,有一些没用的信息,比如这样:

Volume in drive D is DATA 

Volume Serial Number is C47C-9908 

Directory of D:\tmp 

09/26/2001 12:50 PM 18,426 alg0925.txt 

12/02/2001 04:29 AM 795 bsample.txt 

04/11/2002 04:18 AM 2,043 invitation.txt 

4 File(s) 25,651 bytes 

0 Dir(s) 4,060,700,672 bytes free 

for 仍然可以解出其中的文件名并进行操作:

for /f "skip=5 tokens=5" %a in (total.txt) do @if exist %a (DEL %a) else (echo %a不存在)

在这里插入图片描述
官方文档:delims可以指定分隔符,默认是以空格和制表符(tab键)
在这里插入图片描述

比如分离日期:
在这里插入图片描述

for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a

在这里插入图片描述

<6>、查询一个目录下的文件的名字:

这些详细使用可以参考官方文档:

另外,FOR 变量参照的替换已被增强。你现在可以使用下列
选项语法:

     %~I          - 删除任何引号("),扩展 %I
     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩展到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
     %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。
for /r E:\000photo %I in (*.txt) do @echo %~nI

在这里插入图片描述

在这里插入图片描述
看懂这个也就看懂官方文档了,好了,到此for学习的差不多了,后续需要哪些功能,再通过查看官方帮助文档或者网上搜着学习,学习,一下子不可能什么都学得会,不要想着都能掌握住。,慢慢积累。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!