windows 批处理命令必知必会

全局用例,有如下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:\Users\Administrator\Desktop\test.txt) do echo %%i 
pause>nul 

 

 如果不加/f参数,输入如下:

 直接输出了文件名

(2)、delims参数 按指定的字符串切分,默认情况下,只显示第一个分隔符前的内容.如下代码

@echo off
for /f "delims=、" %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

按顿号分割,每一行

注意文件的编码,因为、中文中才有.根据内容发现,其只显示了分隔符之前的内容.

 

(3)、tokens参数,(2)中实例的缺点很明显.通过delims分割后,默认只取分割后第一个内容,如果我要取、后面的内容怎么取?所以tokens参数就是用来解决这个问题的.如下代码:

for /f  "tokens=2 delims=、" %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

 

(4)、tokens参数配合delims参数,delims参数按多个字符分割,然后取一列.

@echo off
for /f  "tokens=2 delims=、." %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

 

(4)、通过tokens提取多列,上面的例子都是提取一列的,假设需要提取序号和后缀,代码如下:

@echo off
for /f "tokens=1,3 delims=、-." %%i in (C:\Users\Administrator\Desktop\test.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:\Users\Administrator\Desktop\test.txt) do echo %%i 
pause>nul 

 

 输出了文本的所有信息,没有任何多余的执行信息.

注:如果不带,如下:

echo off
for /f %%i in (C:\Users\Administrator\Desktop\test.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 变量的方式也需要变换,不能使用%%,而是要使用!!来标记变量.

 

posted @ 2021-01-26 13:09  郑小超  阅读(315)  评论(0编辑  收藏  举报