转载至 http://123304258.blog.163.com/blog/static/12354702012621103256608/

 
【删除目录下某种格式的文件 】
for /r  f:\study %i in (*.o) do del %i
 
DOS循环:bat/批处理for命令详解之一2010-06-04 22:00格式: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个文件夹    
 
 
DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)
 
转自:
http://www.yoyotao.net/ttt/post/137.html
http://blog.csdn.net/weikaifenglove/archive/2009/10/22/4714253.aspx
 
+++
格式: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 
)

Windows的bat脚本中for循环的更多相关文章

  1. 今天我自己第一次写了一个Windows批处理bat脚本,一起学习一下吧。

    今天我自己第一次写了一个Windows批处理bat脚本,备注一下 事情原由:自己使用Java开发了一个加解密的工具.但是当把工具给别人使用的时候,别人还需要把代码编译打包, 然后还需要看一下代码里面的 ...

  2. windows 执行bat脚本

    bat脚本中运行另外一个bat脚本 call 命令 call1.bat内容如下 echo running call1 call2.bat内容如下 @echo off echo start call c ...

  3. shell 脚本中所有循环语法

    写出 shell 脚本中所有循环语法 for 循环 : for i in $(ls);do echo item:$i done while 循环 : #!/bin/bash COUNTER=0 whi ...

  4. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  5. windows常用bat脚本

    windows常用bat脚本 https://blog.csdn.net/longyan_csc/article/details/78737722 Windows_批处理+任务计划实现文件夹定时备份 ...

  6. 关于bat脚本中的命令状态码相关的%errorlevel%变量

    bat脚本中常用%errorlevel%表达上一条命令的返回值,即命令执行状态码.也称命令退出码 一般上一条命令的执行结果返回的值只有两种,0和非0 (如常见的1,2,4,5,9009等等),0一般会 ...

  7. shell脚本中select循环语句用法

    shell脚本中select循环语句 1. 脚本中select的语法格式 select VAR in LIST do command1 command2 ... ... commandN done s ...

  8. bat脚本中%~dp0含义解释

    在Windows脚本中,%i类似于shell脚本中的$i,%0表示脚本本身,%1表示脚本的第一个参数,以此类推到%9,在%和i之间可以有"修饰符"(完整列表可通过"for ...

  9. Windows 用bat脚本带配置启动redis,并用vb脚本使其在后台运行。

    最近,在Windows上用开发PHP程序,需要用到Redis,每天要打开一个运行redis-server.exe的窗口这样比较烦,因为窗口就一直打开着,不能关闭. 所以就想着通过写脚本的方式,让他在后 ...

随机推荐

  1. 微信web开发者工具初探

    最近需要在微信企业号中挂接网页,之前也没有接触过微信开发,刚开始也不知道怎么调试,后来同事介绍使用“微信web开发者工具”,于是在网上下了一个,使用了一下的确很好用.它不仅支持Android和IOS同 ...

  2. Loaders

    Android3.0之后引入了加载器,支持轻松在Activity和Fragment中异步加载数据.加载器具有以下特点: 1.可用于任何Activity和Fragment 2.支持异步加载数据 3.监控 ...

  3. 复制本地文件到HDFS本地测试异常

    项目中需要将本地文件拷贝到hdfs上,由于本人比较懒,于是使用擅长的Java程序通过Hadoop.FileSystem.CopyFromLocalFile方法来实现. 在本地(Window 7 环境) ...

  4. oracle 密码过期处理

    1.查看用户的proifle是哪个,一般是default sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码有 ...

  5. About memories in ASIC FPGA

    1. Write first | Read First | No Change区别在于:en & wr的时候,dout是什么,三种case对应于: dout = din; dout = mem ...

  6. node-webkit 支持pdf浏览

    因为项目最近需要进行pdf文件的预览. 项目:linux平台下使用node-webkit开发的桌面应用. 所以在想如何解决这个问题. 首先,firefox直接可以打开pdf文件,预览效果佳,有菜单,放 ...

  7. C# 序列化反序列化

      序列化,就是格式化,是把一个对象以某种格式进行呈现.主要有三种,1.二进制序列化,2.XML序列化,3.JavaScript序列化. 下面讲一下二进制序列化的过程 1.在需要序列化的类的前面,标记 ...

  8. Linux CPAN Perl 模块安装

    当我们想使用某些Perl模块的时候,很可能会遇到当前系统不存在这个模块的情况,这时我们可以通过使用CPAN来对相应的模块进行获取,下面就介绍一下CPAN的使用方法.首先,我们可以用perl -e 'u ...

  9. 遇到的sql关键字

    select count(1)  相当于  select count(*)  网上有比较差别的 菜鸟不用管

  10. Android自定义View的实现方法,带你一步步深入了解View(四)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回 ...