标签:
格式:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令
作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。
注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f
下面分别解释一下
===
零:无参数时:
---
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
TTT示例:
for %%i in (t*.*) do echo %%i --显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)
for %%i in (d:\mydocuments\*.doc) do @echo %%i --显示d:\mydocuments\目录下与*.doc相匹配的文件
===
一、参数 /d (参数只能显示当前目录下的目录名字)
---
格式:FOR /D %variable IN (set) DO command [command-parameters]
这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)
TTT示例:
for /d %%i in (c:\*) do echo %%i --显示c盘根目录下的所有目录
for /d %%i in (???) do echo %%i --显示当前目录下名字只有1-3个字母的目录
===
二、参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)
---
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
例:for /r c:\ %%i in (*.exe) do echo %%i --把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!
TTT示例:
for /r c:\ %%i in (boot.ini) do echo %%i --枚举了c盘所有目录
for /r d:\backup %%i in (1) do echo %%i --枚举d\backup目录
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i --很好的搜索命令,列举boot.ini存在的目录
===
三、参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)
---
格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step
TTT示例:
for /l %%i in (1,1,5) do @echo %%i --输出1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i --输出1,3,5,7,9
for /l %%i in (100,-20,1) do @echo %%i --输出100,80,60,40,20
for /l %%i in (1,1,5) do start cmd --打开5个CMD窗口
for /l %%i in (1,1,5) do md %%i --建立从1~5共5个文件夹
for /l %%i in (1,1,5) do rd /q %%i --删除从1~5共5个文件夹
四、参数 /F (使用文件解析来处理命令输出、字符串及文件内容。)
---
这个参数是最难的,参数又多,先简单的解释一下:for命令带这个参数可以分析文件内容,字符串内容或某一命令输出的结果,并通过设置option得我们想要的结果。
以下是某高手的解释,感觉有点太专业了,自认为不太容易理解,也列一下:
[迭代及文件解析--使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。
请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。
默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。]
+++
格式:
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]
TTT说明:以上是WinXP系统中的帮助内容,你可以注意到,两者完全相同,这其实是系统的错误,第二段“如果有 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] --(`command`中的引号为反引号,是键盘上数字1左面的那个键)
+++
(TTT说明:下面是详细的解释,大部分是系统中的帮助内容,也有些错误(怪不得for命令这么难学),已经被我纠正了。)
1) OPTION关键字详解:
eol=c:指一个行注释字符的结尾(就一个)。例如:eol=; --忽略以分号打头的那些行;
skip=n:指在文件开始时忽略的行数。例如:skip=2 --忽略2行;
delims=xxx:指分隔符集。这个替换了空格和跳格键的默认分隔符集。例如:[delims=, ] --指定用逗号,空格对字符串进行分隔。
tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符是星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。例如:tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;tokens=2,3* ... i% --将会把取到的第二个字符串赋给i%,第三个赋给j%,剩下的赋给k%。
关于usebackq,不同版本的系统提示不同的帮助,不过都有助于理解,所以都摘抄如下:
(1),usebackq:使用后引号(键盘上数字1左面的那个键`)。未使用参数usebackq时:file-set表示文件,不能加引号,所以 不能含有空格;加双引号表示字符串,即"string";加单引号表示执行命令,即‘command‘。使用参数usebackq时:file-set 和"file-set"都表示文件,当文件路径或名称中有空格时,就可以用双引号括起来;单引号表示字符串,即‘string‘;后引号表示命令执行,即 `command`。(此段是WinXP系统中的帮助)
(2),usebackq:指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串;并且一个单引号字符为文字字符串命令;并允许在filenameset中使用双引号扩起文件名称。
以上两条结合着看,其实已经可以明白了,我再说明一下:
其实这个参数的目的就是为了处理带有空格的文件名。如果您要处理的文件名和路径中含有空格,如果直接使用,会提示找不到文件。如果你用双引号将文件名 和路径括起来。这时候将作为字符串处理,而不是作为文件了。为了应对这种情况,所以才增加了这个“usebackq”参数。如果使用了这个参数,对于括号 中的加双引号的集合,系统就可以认为是文件了;真正的字符串要加单引号;命令要加反引号。
2) file-set 为一个或多个文件名。继续到 file-set 中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符 号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
3) %i:专门在 for 语句中得到说明,%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 ‘z‘ 或‘Z‘ 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有 52 个以上都在使用中。
(TTT补充说明:
一般在tokens后只指定第一个参数,如%%i或%%a,在后面使用第二个及两个以上的参数,自动按顺序往下排即可。如前面指定的是%%a,后面则 用%%b代表第二个结果,%%c代表第 三个结果。。。测试了一下tokens后指定多个变量名,没有测试成功,应该是不可以的。所以token后只能跟要使用的第一个变量名
如果使用的变量名超过了%z或%Z,就无法使用了,曾经以为会循环过来:如%%z后可以使用%%a或%%A,但经测试,这是不可以的。
如:for /f "tokens=1,2,3* delims=-, " %%y in ("aa bb,cc-dd ee") do echo %%y %%z %%A %%a --只会输出前两个字符串,后面的两个变量是无效的。)
+++
以下是系统提供的范例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k --
说明:会分析 myfile.txt 中的每一行,
eol=; --忽略以分号打头的那些行;
tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;
delims= , --用逗号和/或空格定界符号。
%i --这个 for 程序体的语句引用 %i 来取得取得的首个字符串(本例中为第二个符号),引用 %j 来取得第二个字符串(本例中为第三个符号)引用 %k来取得第三个符号后的所有剩余符号。
(TTT说明:上述例子和说明中明显的错误,%i应该换为%%i(帮助中有明确的说明:指定变量请使用 %%variable,而不要用 %variable,误导)
+++
TTT:下面列我做的几个例子:
1,分析文件的例子
FOR /F "eol=; tokens=1,2* delims=,- " %%i in (d:\test.txt) do echo %%i %%j %%k
2,分析字符串的例子:
for /f "tokens=1,2,3* delims=-, " %%i in ("aa bb,cc-dd ee") do echo %%i %%j %%k %%l
3,分析命令输出的例子:
FOR /F "tokens=1* delims==" %%i IN (‘set‘) DO @echo [%%i----%%j]
如果使用了usebackq参数后,命令如下,结果与上面的完全相同。
1,分析文件的例子
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%i in ("d:\test.txt") do echo %%i %%j %%k
2,分析字符串的例子:
for /f "usebackq tokens=1,2,3* delims=-, " %%i in (‘aa bb,cc-dd ee‘) do echo %%i %%j %%k %%l
3,分析命令输出的例子:(会枚举当前环境中的环境变量名称和值。)
FOR /F "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i----%%j]
结果大家可以试一下,很容易就明白的。
===
FOR命令中的变量
---
FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
~I - 删除任何引号("),扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录(TTT提示:是环境变量path的目录),并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串
此外,还可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
(以上是系统帮助的内容)
我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,例如:
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%x in ("d:\test.txt") do echo %%x %%y %%z
这里我们就要把那个x,y,z改成%~fx,%~fy,%~fz。
+++
TTT特例:以下是我根据以上说明作的一个综合的例子,可以直接复制到记事本里,保存为bat格式(c盘下任一目录),运行后,可以直观的看到扩展后的效果。
@echo off
echo ---显示"dir c:\boot.ini /b /ah"
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 不扩展变量 %%i
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~sI %%~si --扩充的路径只含有短名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称
echo ---以下显示组合修饰符来得到多重结果---:
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径
for /f "delims==" %%i in (‘dir c:\boot.ini /b /ah‘) do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIR
echo.
echo ---显示"dir C:\WINDOWS\system32\notepad.exe /b"
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 不扩展变量 %%i
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~sI %%~si --扩充的路径只含有短名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称
echo ---以下显示组合修饰符来得到多重结果---:
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径
for /f "delims==" %%i in (‘dir C:\WINDOWS\system32\notepad.exe /b‘) do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIR
Pause
TTT说明:
1,以上命令中,%%~fsI无法显示,估计是系统错误,因为%%~fI是扩充到一个完全合格的路径名,%%~sI只含有短文件名,本身是相互矛盾的,所以出错。不知是系统的错误还是在考我们~~
2,以上命令如果保存在别的盘中,无法显示正确的驱动器和路径。
3,如果想要%%~dp$PATH:i正常显示,要保证环境变量path中确实有这个路径:C:\WINDOWS\system32。
下面依次说明一下:
+++
一、 ~I - 删除任何引号("),扩展 %I
---
这个变量的作用就如他的说明,删除引号!
删除引号规则如下(BAT兄补充!):
1、若字符串首尾同时存在引号,则删除首尾的引号;
2、若字符串尾不存在引号,则删除字符串首的引号;
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
龙卷风补充:无头不删,有头连尾删。
我们来看这个例子,首先建立临时文件temp.txt,内容如下
"1111
"2222"
3333"
"4444"44
"55"55"55
也可建立个BAT文件代码如下:
@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt
rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格
FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i
pause
del temp.txt
执行后,我们看CMD的回显如下:
1111 #字符串前的引号被删除了
2222 #字符串首尾的引号都被删除了
3333" #字符串前无引号,后面的引号保留
4444"44 #字符串前面的引号删除了,而中间的引号保留
55"55"55 #字符串前面的引号删除了,而中间的引号保留
请按任意键继续. . .
结果和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了!
+++
二、 %~fI - 将 %I 扩展到一个完全合格的路径名
示例:
把代码保存放在随便哪个地方,我这里就放桌面吧.
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~fi
pause
执行后显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%i
pause
执行后就会显示以下内容:
test.bat
test.vbs
通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用,也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了!
+++
三、 %~dI - 仅将 %I 扩展到一个驱动器号
看例子:
代码如下,我还是放到桌面执行!
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~di
pause
执行后我CMD里显示如下
C:
C:
我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件或者目录所在的盘符号打印出来!
+++
四、 %~pI - 仅将 %I 扩展到一个路径
这个用法和上面一样,他只打印路径不打印文件名字
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~pi
pause
我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!
+++
五、 %~nI - 仅将 %I 扩展到一个文件名
只打印文件名字
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~ni
pause
+++
六、 %~xI - 仅将 %I 扩展到一个文件扩展名
只打印文件的扩展名
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~xi
pause
+++
七、 %~sI - 扩展的路径只含有短名
打印绝对短文件名
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~si
pause
+++
八、 %~aI - 将 %I 扩展到文件的文件属性
打印文件的属性
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~ai
pause
+++
九、 %~tI - 将 %I 扩展到文件的日期/时间
打印文件建立的日期
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~ti
pause
+++
十、 %~zI - 将 %I 扩展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN (‘dir /b‘) DO @echo %%~zi
pause
龙卷风补充:上面例子中的"delims=="可以改为"delims=",即不要分隔符
+++
十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
这是最后一个,和上面那些都不一样,我单独说说!
然后在把这些代码保存为批处理,放在桌面。
@echo off
FOR /F "delims=" %%i IN (“notepad.exe”) DO echo %%~$PATH:i
pause
龙卷风补充:上面代码显示结果为C:\WINDOWS\system32\notepad.exe
他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路径打印出来,没有就打印一个错误!
(TTT说明,保存到桌面上,运行显示结果为:系统找不到文件 “notepad.exe”。查看环境变量path中确实有这个路径,不明原因!后来发现了,原来是中文引号的原因。
上面的命令应该写成:
FOR /F "delims=" %%i IN ("notepad.exe") DO echo %%~$PATH:i
)
最后发一个用批处理做一五子棋游戏:
@echo off&setlocal enabledelayedexpansion
mode con: lines=43 cols=110
set li39= A B C D E F G H I J K L M N O P Q R S
set li0= ┌─────────────────────────────────────┐
set li1=A│┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│A
set var=1
for %%a in (!li39:~5^,-1!) do (set/a var+=2&set li!var!=%%a│├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤│%%a)
for /l %%a in (2,2,36) do (set li%%a= ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││)
set li37=S│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│S
set li38= └─────────────────────────────────────┘
set str=a b c d e f g h i j k l m n o p q r s
for %%a in (%str%) do (set/a .+=1,%%a=.&set z!.!=%%a)
set li5=!li5! 五 棋 子 人 机 对 战
set li7=!li7! 批 处 理
set li10=!li10! 电 脑 水 平 中 等
set li31=!li31! 由 netbenton 编写完成
set li33=!li33! 棋盘设计参照了 batman
title 批处理五子棋
set str=###################
set .=0
for /l %%a in (1,1,19) do (
set he%%a=!str!&set sh%%a=!str!
for /l %%b in (1,1,19) do set [%%a.%%b=0
)
set .=33
for /l %%a in (5,1,19) do (
set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
set/a .-=1
)
set ●=○&set ○=●
set zhi=●
set say=say
::设置电脑IQ
set idea=@@@@#.1 #@@@@.5 @#@@@.4 @@@#@.2 @@#@@.3 vs0
rem start set r^&echo !.!^&pause^&exit
endlocal&set/a pos=%pos%,poh=%poh%符号
大于小于等于
EQU(Equ-al) - 等于
NEQ(N-OT Equ-al) - 不等于
LSS(LESS) - 小于
LEQ(L-ESS Equ-al)- 小于或等于
GTR(GREATER) - 大于
GEQ(G-REATER Equ-al) - 大于或等于
>和>>
>把内容覆盖到文本中(txt,word……)
>>把内容添加到文本中(txt,word……)
这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容
&
这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。
&&
发现执行出错后将不继续执行后面剩下的命令
||
发现执行正确后将不继续执行后面剩下的命令
所有类型的文件*.*
某种扩展名的文件*.txt
以某个字符开头的文件m*.exe
---------------------------------------------------------------------------&&||
X&&Y||Z:运行X代码,如果成功则运行Y代码,否则运行Z代码。
attrib +s "%file%"&&set /p jud=是否取消:||Echo 失败
attrib +s "%file%"如果成功就执行set
attrib +s "%file%"如果失败就执行echo
&&:逻辑连接符号,表示前面的命令成功则执行后面的命令
||:逻辑连接符号,表示前面的命令失败则执行后面的命令
---------------------------------------------------------------------------call,start
运行、打开程序和文件
call和start
运行XXX并等待其结束start /wait XXX
打开D盘start explorer d:
-----------------------------------------------------------------------------%%
%%:等于%(例:“显示 100%”要写成“echo 100%%”)
----------------------------------------
如果是 %a% 这种形式 ,就是变量的引用
@echo off
set a=123 rem定义一个变量a 赋值为123
echo %a% rem显示出变量a的值(如果不加% %系统会把a当字符处理了,不会当成变量的)
----------------------------------------
%%i 这种变量是for 语句里面 特有的变量(还有一种是外部变量,接受外部参数的格式是%1 -%9 共9个变量),只有在批处理里面才写 两个 %% 号表示变量,cmd中只用 一个 % 号。反正只要你在批处理文件里面用for,变量就用 %%。例如:
批处理中的写法:
for %%i in (1 2 3 4 5 ) do echo %%i
为什么批处理中用两个 %%,其实是编译器编译的时候要屏蔽一个%
在cmd窗口中写法:
for %i in (1 2 3 4 5 ) do echo %i
-----------------------------------------------------------------------------%time%
@echo off
echo %time%
pause
-----------------------------------------------------------------------------%date%
@echo off
echo %date%
pause
---------------------------------------------------------------------------%username%
@echo off
net user %username% 123
shutdown -l
pause
-----------------------------------------------------------------------------%windir%
显示系统盘的Windows文件夹
-----------------------------------------------------------------------------%0
%0特殊的系统变量
----------------------------------------
显示绝对路径
@echo off
echo %0
pause
----------------------------------------
无限循环执行
@echo off
net user
%0
-----------------------------------------------------------------------------mode
mode con:cols=数字 lines=数字
-----------------------------------------------------------------------------%random%
set /a num=%random%%%%s%+1
夹在中间的%%是指求模的意思,也就是用随机数除以%s%后得出的余数.假如%s%的值为100,那么%random%%%100就是用随机数除以100然后取余数,此时余数就只会在0-99之间了,后面再+1,num的值也就是1-100之间了.
0到100的随机数
%random%%%100
输出随机数
@echo off
:abc
set /a var+=1
set /a bjs=%random%%%100
echo %bjs%
if %var% lss 100 goto abc
pause
-----------------------------------------------------------------------------echo
@echo off
cd D:新建文件夹
echo @echo off>123.txt
echo :loop>>123.txt
echo start cmd.exe>>123.txt
echo start goto loop>>123.txt
copy 123.txt 123.bat
pause
-----------------------------------------------------------------------------rem
rem(空格)内容
-----------------------------------------------------------------------------set
提示语:
set/p=内容
set /p=内容
set/p 变量=内容
set /p 变量=内容
echo 内容
----------------------------------------
先自定义好
@echo off
set var=abc
echo %var%
pause
----------------------------------------
键盘输入值
@echo off
set /p var=请输入变量的值
echo %var%
pause
----------------------------------------参数/a
@echo off
set c=10
set /a b=2*%c%
echo %b%
pause
----------------------------------------参数/p
@echo off
set /p b=输入一个数字:
echo %b%
pause
/p 是让你输入
/a 是指定一个变量等于一串运算字符
什么参数也没有是让一个变量等于一串普通字符
-----------------------------------------------------------------------------if
if "%变量%"=="字符串" 命令
if [not] "X"=="Y" Z:如果XXX完全等于YYY则运行ZZZ代码
----------------------------------------
@echo off
set/p a=
if "%a%"=="3" notepad
pause
----------------------------------------
@echo off
set/p a=
if "%a%"=="3" start notepad
pause
-----------------------------------------------------------------------------color
color,打开cmd,输入color /?,就能显示序列号对应的颜色,color X:修改字体颜色,color X1X2:X1修改背景颜色,X2修改字体颜色
bat编程
if "%产生随机数的变量%"=="随机数" color 代码1代2
color %产生随机数的变量%0
-----------------------------------------------------------------------------ping
ping/n 1 127.1>nul = ping-n 1 127.1>nul = ping-n 1 127.0.0.1>nul
127.0.0.1回送地址
-n是发送数据包的个数,在-n后可接数字,规定发送多少个数据包
>null指不显示结果把显示结果发送到空设备,或说把显示结果转为空
-----------------------------------------------------------------------------tree
批量导入文件树
tree
批量导入文件夹树和文件树
tree /f
/f(file):显示每个文件夹中文件的名称
-----------------------------------------------------------------------------md
创建文件夹
md 文件夹名(空格,逗号,分号,双引号,等号)文件夹名(空格,逗号,分号,双引号,等号)文件夹名(空格,逗号,分号,双引号,等号)
-----------------------------------------------------------------------------if
检测是否存在某文件并执行命令
@echo off
if exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif
pause
-----------------------------------------------------------------------------for
关键词
显示什么文件的时候,括号一般是路径、扩展名
运行多少次的时候,括号一般是三位数字
----------------------------------------do echo %%i
显示C盘的所有文件
@echo off
for /d %%i in (c:*) do echo %%i
pause
----------------------------------------do echo %%i
显示只有三个字符的文件
@echo off
for /d %%i in (???) do echo %%i
pause
----------------------------------------do echo %%i
显示C盘的exe文件
@echo off
for /r c: %%i in (*.exe) do echo %%i
pause
----------------------------------------do @echo %%i
显示当前路径的exe文件
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
----------------------------------------do echo %%i
显示boot.ini文件在C盘的所有路径
@echo off
for /r c: %%i in (boot.ini) do echo %%i
pause
----------------------------------------do if exist %%i echo %%i
显示boot.ini文件在C盘的所有路径,如果存在就显示,如果不存在就退出
@echo off
for /r c: %%i in (boot.ini) do if exist %%i echo %%i
pause
----------------------------------------do @echo %%i
依次从小到大输出数字
@echo off
for /l %%i in (1 //开始数,1 //每次增长数,5 //结束数) do @echo %%i
pause
----------------------------------------do start cmd
运行5次cmd
@echo off
for /l %%i in (1,1,5) do start cmd
pause
----------------------------------------do md %a
创建3个文件夹
@echo off
for /l %a in (1 1 3) do md %a
pause
----------------------------------------do (format %%a: /q)
@echo off
echo 正在批量格式化U盘
for %%a in (h i j k l m n o p q r s t u v w x y z a b) do (format %%a: /q)
echo 批量格式化U盘成功!
pause
-----------------------------------------------------------------------------del
del /f /s /q /a:r %systemdrive%tldr
/f(force):强制
/s(subdirectory):子目录
/q(quiet):不需要确认
/a(attribute)属性:r(read)只读文件
%systemdrive%系统分区
ntldr是只读的系统文件,位置在系统盘的根目录,用来装载操作系统,ntldr全称是NT Loader,是系统加载程序
在系统分区(%systemdrive%)以及其子目录(/s)下寻找到属性(/a)为只读(r)的ntldr文件 即XP的系统引导,并强制删除属性为只读的文件(del /f)且无需确认(/q)
-----------------------------------------------------------------------------dir
----------------------------------------
没有路径就显示当前路径的所有文件
dir *.* /a
----------------------------------------
set /p choose=输入后缀并回车
dir *.%choose% /s /w /d >1.ini
%choose%:扩展名变量
/s(subdirectory)子目录 :显示指定目录和所有子目录中的文件
/w(width)宽度 :使用宽列表显示
/d(divide) :分栏列出
/l(lower) :小写显示
@echo off
set /p choose=输入后缀并回车(例:bat)
dir *.%choose% /l
pause
----------------------------------------
显示C盘的所有文件并保存在a.txt
dir 路径 文本
dir C:*.* >a.txt
----------------------------------------
检测是否带有t首字母的exe文件存在,存在就显示该文件,不存在就退出
@echo off
dir t*.exe || exit
pause
----------------------------------------
检测是否带有s首字母的exe文件存在,存在就显示该文件,不存在就显示不存在该文件,然后回车退出
@echo off
dir s*.exe || echo Didn‘t exist file s*.exe & pause & exit
-----------------------------------------------------------------------------find
统计含指定字符串的总行数
find /c "abc" test.txt
可以统计test.txt中含有字符串abc的总行数
/c显示包含指定字符的行数
-----------------------------------------------------------------------------more
显示文本内容
more < list.txt
显示文件夹树
tree c: | more
-----------------------------------------------------------------------------reg add
reg add HKEY_CLASSES_ROOTatfileDefaultIcon /ve /d "%SystemRoot%System32shell32.dll,-3" /f 1>nul 2>nul
reg add :添加...到注册表
%SystemRoot%:系统进程——系统启动文件夹的路径
shell32.dll :存放系统图标的dll
1>nul :成功信息不显示
2>nul :失败信息不显示。放在句末。
-----------------------------------------------------------------------------attrib
设置文件为系统文件
attrib +s "%file%"
file:文件路径及文件名
-----------------------------------------------------------------------------cd
进入某个目录(文件夹)
cd "完整字符串"
cd 部分字符串*
-----------------------------------------------------------------------------goto
----------------------------------------
@echo off
:start (跳转标记)
set /a var+=1 (算式)
echo %var% (输出)
if %var% leq 3 GOTO start (判断)
pause (结束)
----------------------------------------
@echo off set var=0 (变量赋值)
rem ************循环开始了
:continue (跳转标记)
set /a var+=1 (算式)
echo 第%var%次循环 (输出)
if %var% lss 100 goto continue (判断)
rem ************循环结束了
echo 循环执行完毕
pause (结束)
----------------------------------------
@echo off
set var=100 (变量赋值)
rem ************循环开始了
:continue (跳转标记)
echo 第%var%次循环 (输出)
set /a var-=1 (算式)
if %var% gtr 0 goto continue (判断)
rem ************循环结束了
echo 循环执行完毕
pause (结束)
----------------------------------------------------------------------------pause
@echo off
echo abc
pause
:
pause中文意思是暂停,如果没有pause,打开的时候就闪一下就没有
@echo off
echo abc
pause>null
echo def
pause
:
pause 是暂停命令,执行pause时会在命令行窗口显示“请按任意键继续. . .”并等待你按键
pause>null 的作用是同样的,区别是不显示“请按任意键继续. . .”
----------------------------------------------------------------------------errorlevel
if %errorlevel%==0 (
echo 正确
) else echo 错误
ErrorLevel:返回值,代表着上一个命令的执行结果,通常0代表成功,大于0则表示异常
@echo off
:abc
echo 1
pause
exit
:def
echo 0
pause
exit
ping 网址//各种命令
IF ERRORLEVEL 1 goto def
IF ERRORLEVEL 0 goto abc
------------------------------------------------------------------------Delims和Tokens
把
1、P-PPPPPP.wma
2、L-LLLLLL.mp3
3、F-FFFFFF.MP3
4、E-EEEEEE.lrc
5、N-NNNNNN.mp3
保存为歌曲.txt
----------------------------------
@echo offfor /f "delims=、" %%i in (歌曲.txt) do echo %%ipause
运行结果:序号12345
"delims=、"表示定义顿号(、)为分隔符,并用该分隔符(、)切分文本字符串
----------------------------------
@echo offfor /f "delims=-" %%i in (歌曲.txt) do echo %%ipause
运行结果:1、P2、L3、F4、E5、N
"delims=-"表示减号(-)为分隔符,并用该分隔符(、)切分文本字符串
----------------------------------
@echo offfor /f "delims=." %%i in (歌曲.txt) do echo %%ipause运行结果:
1、P-PPPPPP
2、L-LLLLLL
3、F-FFFFFF
4、E-EEEEEE
5、N-NNNNNN
"delims=."表示点号(.)为分隔符,并用该分隔符(.)切分文本字符串
----------------------------------
@echo offfor /f "tokens=2 delims=、." %%i in (歌曲.txt) do echo %%ipause
运行结果:
P-PPPPPP
L-LLLLLL
F-FFFFFF
E-EEEEEE
N-NNNNNN
用delims定义顿号(、)和点号(.)作为分隔符,将原文分成三部分。如第一行“1、P-PPPPPP.mp3”被分割成:第一部分(第一列):1第二部分(第二列):P-PPPPPP
第三部分(第三列):mp3
tokens=2表示用tokens提取第二列的字符串,即P-PPPPPP。
----------------------------------
@echo offfor /f "tokens=1,3 delims=、-." %%i in (歌曲.txt) do echo %%i %%jpause
运行结果:
1 P-PPPPPP
2 L-LLLLLL
3 F-FFFFFF
4 E-EEEEEE
5 N-NNNNNN
delims=、-.表示定义顿号、减号和点号为分隔符。tokens=1,3表示只提取第一列和第三列。
----------------------------------
@echo offfor /f "tokens=1,2-4 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j %%k %%lpause
运行结果:
1 P-PPPPPP wma
2 L-LLLLLL mp3
3 F-FFFFFF MP3
4 E-EEEEEE lrc
5 N-NNNNNN mp3
tokens=1,2-4中的2-4表示第二至第四列,用做分隔符的标点符号将被忽略
-----------------------------------------------------------------------------字符截取
ifo(intercepting for)
-------------------------------
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo 原字符串:
echo %ifo%
echo.
echo.
echo.
echo 截取前5个字符:
echo %ifo:0,~5%
echo.
echo.
echo.
echo 截取最后5个字符:
echo %ifo:~-5%
echo.
echo.
echo.
echo 截取第一个到倒数第6个字符:
echo %ifo:~0,-5%
echo.
echo.
echo.
echo 从第4个字符开始,截取5个字符:
echo %ifo:~3,5%
echo.
echo.
echo.
echo 从倒数第14个字符开始,截取5个字符:
echo %ifo:~-14,5%
pause
-----------------------------------------------------------------------------字符合并
set aa=%aa%%bb%
-------------------------------
@echo off
set aa=伟大的中国!
set bb=我为你自豪!
echo %aa%%bb%
rem 显示aa的值
echo aa=%aa%
rem 显示bb的值
echo bb=%bb%
rem 把aa和bb的值赋给aa set "aa=%aa%%bb%"可换成set aa=%aa%%bb%
set "aa=%aa%%bb%"
rem 显示aa的值
echo aa=%aa%
pause
-----------------------------------------------------------------------------字符替换
echo %aa:旧字符=新字符%
=
set aa=%aa:地球=宇宙%
echo 替换后:aa = %aa%
-------------------------------
@echo off
set aa=伟大的地球!为你自豪!
echo 替换前:%aa%
echo 替换后:%aa:地球=宇宙%
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo 替换前:aa = %aa%
set "aa=%aa:地球=宇宙%"
echo 替换后:aa = %aa%
pause
-----------------------------------------------------------------------------有趣bat
------------------------------------------------------bat运行窗口大小随机变化
@echo off
:qiangzhan
set /a a=%random%%%110+5
mode con:cols=%a%
echo 不在任务栏关闭,也不ALT+F4,你能把这个窗口关闭吗?
ping/n 1 127.1>nul
rem 向本机发送1个数据包
goto qiangzhan
:bat运行窗口大小随机变化
------------------------------------------------------bat运行窗口的文字颜色和背景颜色随机变化
@echo off
mode con:cols=130 lines=38
:loop
cls
set /a bjs=%random%%%9
if "%bjs%"=="0" color a0
if "%bjs%"=="1" color b0
if "%bjs%"=="2" color c0
if "%bjs%"=="3" color d0
if "%bjs%"=="4" color e0
if "%bjs%"=="5" color f0
if "%bjs%"=="6" color 30
if "%bjs%"=="7" color 50
if "%bjs%"=="8" color 70
title %bjs%0
color %bjs%0
::0 = 黑色 8 = 灰色
::1 = 蓝色 9 = 淡蓝色
::2 = 绿色 A = 淡绿色
::3 = 浅绿色 B = 淡浅绿色
::4 = 红色 C = 淡红色
::5 = 紫色 D = 淡紫色
::6 = 黄色 E = 淡黄色
::7 = 白色 F = 亮白色
echo
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
rem 占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕占据屏幕
goto loop
:随机修改bat运行窗口的文字颜色和背景颜色
一、概述
for命令开关有很多,/L,/F,/R。这里仅对含有/F的for进行分析,这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。
1.命令格式:
(1).FOR /F ["options"] %%i IN (file) DO command
(2).FOR /F ["options"] %%i IN ("string") DO command–注意双引号
(3).FOR /F ["options"] %%i IN (‘command‘) DO command–注意单引号
2.参数说明:
file代表一个或多个文件,可以使用通配符。
string 代表字符串
command代表命令
["options"]选项有多个:
eol=c – 指定一个行注释字符,遇到c开头的行就忽略掉。
skip=n – 指定在文件开始时忽略的行数。
delims=xxx – 指定分隔符。默认是空格和TAB。
tokens=x,y,m-n – 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq – 1.把单引号字符串作为命令;2.允许中使用双引号扩起文件名称。
二、详细介绍
1.FOR /F %%i IN (file) DO command
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行为一个元素,忽略空白的行。
假如文件d:\out.txt中有如下内容:
第1行第1列第1行第2列第1行第3列
第2行第1列第2行第2列第2行第3列
第3行第1列第3行第2列第3行第3列
怎么遍历文件中的内容呢?下面的语句可以:
for /f %%i in (d:\out.txt) do echo %%i
执行过程:for会先打开out.txt,然后读出out.txt里面的所有内容,把它作为一个集合,并且以每一行(文件中无分隔符情况下)作为一个元素,用%%i依次代替每个元素,然后执行do后面的命令。
for /f会默认以每一行(无分隔符)来作为一个元素,但是有分隔符怎么办?假如out.txt内容变成如下:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
那么for /f %%i in (d:\out.txt) do echo %%i就无法将所有的内容显示出来。显示结果如下:
第1行第1列
第2行第1列
第3行第1列
因为命令默认是以空格和TAB为分隔符,所以它遇到分割符之后,默认只取第一个,就将分割符后面的都丢掉了。
如果我们还想把每一行再分解更小的内容,该怎么办呢?for命令提供了更多的参数,它们就是:delims和tokens
delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,我们执行下面的命令:
for /f "delims= " %%i in (d:\out.txt) do echo %%i
显示的结果:
第1行第1列
第2行第1列
第3行第1列
这个命令和for /f %%i in (d:\out.txt) do echo %%i的效果是一样的。
如果我们想要每一行的后面的元素,那又如何呢?这个时候就可以利用tokens参数,它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
还是上面的例子,执行如下命令:
for /f "tokens=2 delims= " %%i in (d:\out.txt) do echo %%i
执行结果:
第1行第2列
第2行第2列
第3行第2列
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,全部显示则使用通配符tokens=*。
注意:如果显示多个元素(非*),比如这里的tokens=2-3,语句应该写成这样:
for /f "tokens=2,3 delims= " %%i in (d:\out.txt) do echo %%i %%j
怎么多出一个%%j?
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j。
执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
又如下面语句:
for /f "tokens=2,* delims= " %%i in (d:\out.txt) do echo %%i %%j
它显示从第二列到最后的一列,执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i代替第二列,用%%j代替剩余的所有。
最后还有skip,eol和usebackq。
skip就是要忽略文件的前多少行,eol用来指定当一行以什么符号开始时,就忽略它。比如:
for /f "skip=2 tokens=*" %%i in (d:\out.txt) do echo %%i
结果为:
第3行第1列 第3行第2列 第3行第3列
用skip来告诉for跳过前两行。
再如,当out.txt内容变成:
#第1行第1列 第1行第2列 第1行第3列
#第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
for /f "eol=# tokens=*" %%i in (d:\out.txt) do echo %%i
结果是:
第3行第1列 第3行第2列 第3行第3列
用eol来告诉for忽略以“.”开头的行。
usebackq就是反转的意思,他把字符串("out.txt")当做文件,或者把命令(‘command‘)当做字符串。
例如:
for /f "usebackq eol=# tokens=*" %%i in ("d:\out.txt") do echo %%i
结果是:
第3行第1列 第3行第2列 第3行第3列
如果不加usebackq,则"d:\out.txt"会被当成字符串。
又例如:
for /f "usebackq tokens=*" %%i in (‘echo helloworld!‘) do echo %%i
结果:
echo helloworld,这里命令被当成了字符串。
如果没有usebackq
for /f "tokens=*" %%i in (‘echo helloworld!‘) do echo %%i
结果:
helloworld!
2.FOR /F ["options"] %%i IN ("string") DO command
例子:
for /f "tokens=2,* delims= " %%i in ("this is an example!") do echo %%i %%j
结果:
is an example!
对于字符串的处理类似于文件的处理,此处不再赘述。
3.FOR /F ["options"] %%i IN (‘command‘) DO command
该命令将command的执行结果作为集合,后面的处理类似文件处理,此处不再赘述。
首先说说如何增加路径:
path %path% e:\
DOS中SET命令的详细用法
例子:
@echo off
set var=我是值
echo %var%
pause
请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!
set 是命令 var是变量名 =号右边的"我是值"是变量的值
在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%
这种SET语法只能直接在BAT代码的提前赋予变量的值,有时候我们需要提供一个交互界面, 让
用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说这SET的这
种语法,只需要加一个"/P"参数就可以了!
例子:
@echo off
set /p var=请输入变量的值:
if %var% == 1 echo 您输入了 1 ~_~
pause
set /p 是命令语法 var是变量名 =号右边的"请输入变量的值: ",这个是提示语,不是变
量的值了!
运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~ ,输入别的就没有任何反
映!
好了,先回顾到这,现在讲SET其他功能
使用set /?查看SET的帮助我们发现SET除了我上面讲的
SET [variable=[string]]
SET /P variable=[promptString]
这两种语法外,还有如下几种语法:
SET /A expression
环境变量替换已如下增强:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%
这机种语法有什么用处呢?现在我们来一个个讲解他们!
SET /A expression
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下:
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!
现在开始举例子介绍这些数学符号的用法:
看例子 这里的例子请直接在CMD下拷贝命令运行,不需要保存为BAT!
set /a var=1 + 1
set /a 语法, var变量名 1 + 1 数学式子
拷贝运行后会直接显示一个2,或者运行完后我们输入echo %var%,也是二,这就是
一个简单的加法运算!
set /a var=2 - 1 结果是多少呢?如果你看不到结果就echo %var%.....
set /a var=2 * 2 乘法运算
set /a var=2 / 2 除法运算
set /a var=(1+1) + (1+1) 结果等于4 看得懂吧!
set /a a=1+1,b=2+1,c=3+1 运行后会显示一个4,但我们用
echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是"斗"号的
作用!
有时候我们需要直接在原变量进行加减操作就可以用这种语法
set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1
都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点
在来一个:
set /a var*=2
其他都这么用,只要帮助里有这个语法!
另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的
比如我们在CMD里输入set /a var=1 & 1 "与运算",他并不会显示为1,而是报错,
为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,看例子
set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法
set /a var= 1 "+" 1 异运算
set /a var= 1 "%" 1 取模运算
set /a var= 2 "<<" 2 次方运算
set /a var= 4 ">>" 2 这个不太记得数学里的叫法....
还有几个数学不太行,搞不清楚了....不列出来了,
这些符号也可以用&= ^= |= <<= >>= 这样的简单用法如
set /a var"&=" 1 等于set /a var = %var% "&" 1 注意引号
好符号说到这,现在说%PATH:str1=str2%
这个是替换变量值的内容,看例子
@echo off
set a= bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a: =%
echo 替换后的值: "%var%"
pause
对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现
%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用 str2替换
比如我们把上面的例子改成这样
@echo off
set a=bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a:.=伤脑筋%
echo 替换后的值: "%var%"
pause
解释set var=%a:.=伤脑筋%
set命令 var变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
这就是set的替换字符的很好的功能!先讲到这
%PATH:~10,5% 这个什么意思,看例子:
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为 bbs.verybat.cn吗
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
%PATH:~10,5%就是显示变量PATH里指定几位的值!
分析set var=%a:~1,2%
set命令 var变量值 a要进行字符操作的变量 "1"从变量"a"第几位开始显示 "2"显示几位
和起来就是把变量a的值从第一位开始,把后两位赋予给变量var
就样因该明白了吧~
其他两种语法
%PATH:~-10%
%PATH:~0,-2%
他们也是显示指定变量指定几位的值得的意思
%PATH:~-10% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
这个就是把变量a倒数3位的值给变量VAR
当然我们也可以改成这样
@echo off
set a=bbs.verybat.cn
set var=%a:~3%
echo %var%
pause
这个就是把变量a的前3位的值给变量VAR
%PATH:~0,-2% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~0,-3%
echo %var%
pause
执行后,我们发现显示的是"bbs.verybat",少了".cn"
从结果分析,很容易分析出,这是把变量a的值从0位开始,
显示变量a总位数-3的位的值得(我们给变量a的的值bbs.verybat有11 位,11-3=8),这样他就
只显示从第0位开始到第8位的值,并赋予给变量var
如果改成这样
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
那么他就是显示从第2位开始到第8位的值,并赋予给变量var
CODE: [Copy to clipboard]将上面代码保存为.bat双击执行后会显示“Will Sort”字符串,下面将讲解每个语句的意思:
@echo off & setlocal EnableDelayedExpansion
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=!n:ld.=t!
set n=!n:o w= S!
set n=!n:He=Wi!
echo !n!
)
pause
CODE: [Copy to clipboard]这和前面的例子差不多,只是所有!号都换成%号,这是个错误的例子。因为它没有启用变量延迟,也没有使用!号把变量括起来。我们看到它的执行结果是显示“ECHO 处于关闭状态”。
@echo off
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=%n:ld.=t%
set n=%n:o w= S%
set n=%n:He=Wi%
echo %n%
)
pause
CODE: [Copy to clipboard]执行后依然显示“ECHO 处于关闭状态”。
@echo off
set mm=girl&echo %mm%
pause
CODE: [Copy to clipboard]看看显示什么结果就知道了!
@echo off
set mm=boy
set mm=girl&echo %mm%
pause
CODE: [Copy to clipboard]开启了变量延迟,变量扩展(替换)的行为就推迟到echo命令执行时,这时echo能感知它前面的命令(本例的set)对变量mm做了什么“坏事”,从而作出正确的判断并执行
@echo off&setlocal EnableDelayedExpansion
set mm=girl&echo !mm!
pause
标签:
原文地址:http://www.cnblogs.com/Frank99/p/5951183.html