全局用例,有如下txt文件,内容如下:
1、java.jar 2、.net.dll 3、javascript.js 4、image.jpeg 5、html.htm
1、for命令
(1)、参数 /f 代表扫描文件,打印文件所有内容,代码如下:
for /f %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
如果不加/f参数,输入如下:
直接输出了文件名
(2)、delims参数 按指定的字符串切分,默认情况下,只显示第一个分隔符前的内容.如下代码
@echo off for /f "delims=、" %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
按顿号分割,每一行
注意文件的编码,因为、中文中才有.根据内容发现,其只显示了分隔符之前的内容.
(3)、tokens参数,(2)中实例的缺点很明显.通过delims分割后,默认只取分割后第一个内容,如果我要取、后面的内容怎么取?所以tokens参数就是用来解决这个问题的.如下代码:
for /f "tokens=2 delims=、" %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
(4)、tokens参数配合delims参数,delims参数按多个字符分割,然后取一列.
@echo off for /f "tokens=2 delims=、." %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
(4)、通过tokens提取多列,上面的例子都是提取一列的,假设需要提取序号和后缀,代码如下:
@echo off for /f "tokens=1,3 delims=、-." %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i %%j pause>nul
关于更多for命令参考 https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/for
2、@echo off命令
关闭所有命令(包括本身这条命令)的回显,1.1中的代码显然不是想要的,因为每echo一次,都会回显一次,关于回显ms给出了解释,大致就是每一行echo都会在命令行中执行一下,但显然不是我想要的,我要在一块的输出,所以@echo off命令用上了.代码如下:
@echo off for /f %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
输出了文本的所有信息,没有任何多余的执行信息.
注:如果不带,如下:
echo off for /f %%i in (C:UsersAdministratorDesktop est.txt) do echo %%i pause>nul
关于更多echo 参考https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/echo
3、setlocal enabledelayedexpansion延迟环境变量扩展
windows批处理命令对变量的处理,采用替换的方式,且其是一句一句(必须是一条完整的语句)执行的.如果不明白,看如下例子.
(1)、定义一个变量,并输出:
显然,cmd将上面的操作分为两条语句.所以输出正常.下面换种写法
按常规思路输出应为1,但是错了,所以windows批处理命令对变量的处理,采用替换的方式,且其是一句一句(必须是一条完整的语句)执行的这句话看起来是对的.因为cmd将其看作了一条语句,大家一起执行(猜的),那么输出var的时候set var=1还没有执行,所以没有输出.
如何实现常规思路的结果呢?通过setlocal enabledelayedexpansion,通过延时的方式,将这条语句拆分,一个个执行(猜的),如下:
@echo off & setlocal enabledelayedexpansion set var=1 & echo !var! pause
(2)、从(1)中找出了cmd这个特性,那么所有带()的命令都会有如此特性,如for if等
(3)、正因为cmd的如此特性,对应echo 变量的方式也需要变换,不能使用%%,而是要使用!!来标记变量.