批处理for中的变量扩展
bat吧
全部回复
仅看楼主
level 7
阿胖86 楼主

整理硬盘时发现这个东东,以前收集整理的。不知道有没有人发过,若有错误请指正。
如果你是批处理新手,看到别人写的批处理代码中出现诸如%%~dpa、%%~nxa,你肯定感到迷惑不解。
其实,这就是批处理for中对变量%%a的扩展(姑且这么称呼),看了下面的说明后你应该不会再迷惑了。
批处理for中的变量名可以是单个字母、数字(如%%A或%%a)等。以下均以%%I为例。
(一)
%%~I——删除全部引号("),扩展 %%I(for /?帮助是这样说的)
先看看下面这个例子:
复制下面分割线以内的文字,保存到c:\a.txt,内容如下:
--------------分割线--------------
"1111
2222"
"3333"
"44"44
--------------分割线--------------
然后复制下面代码,保存为bat文件,随便保存到哪里都行(例如保存到桌面test.bat)。
--------------分割线--------------
@ echo off
for /f "delims=" %%I in (c:\a.txt) do echo,%%~I
pause
--------------分割线--------------
双击test.bat文件,CMD窗口显示:
与a.txt中的内容比较,会发现第1、3、4行的引号消失了,这就是%%~I删除引号的效果。
删除引号的规则为:
1.若字符串首部存在引号,首部的引号将被删除(如第1行);
2.若字符串首尾同时存在引号,则同时删除首尾的引号(如第3行);
3.若引号出现在字符串首部和中间,则只删除字符串首部的引号(如第4行);
4.若引号只出现在字符串中间或者只出现在尾部,则引号不被删除(第2行)。
(二)
%%~fI——将 %%I 扩展到一个完全合格的路径名
f是英文单词Full的缩写,完全、全部的意思。
复制下面代码,同样保存到桌面,命名为test.bat文件。
--------------分割线--------------
@ echo off
for %%I in ("x:\abc\\def//g.txt ") do (
echo,原字符串--%%I&echo,合格路径--"%%~fI"
)
pause
--------------分割线--------------
双击test.bat,cmd窗口显示如下:
可能你已经注意到了,test.bat中引号包围的字串有正斜杠,有反斜杠,g.txt后面还含有空格,是“不合格的”路径。而cmd窗口显示的路径为“合格的”路径。
for首先将引号包围的字串当作文件路径来处理,并将该字串赋值给变量%%I,%%~fI可以将“不合格的”路径修正为“合格的”路径,是不是很神奇?
(三)
%%~dI——仅将 %%I 扩展到一个驱动器号
%%~pI——仅将 %%I 扩展到一个路径
%%~nI——仅将 %%I 扩展到一个文件名
%%~xI——仅将 %%I 扩展到一个文件扩展名
d、p、n、x分别是英文单词Drive、Path、Name、eXtension的缩写
还是以(二)中的代码为例,稍作修改,如下:
--------------分割线--------------
@ echo off
for %%I in ("x:\abc\\def//g.txt ") do (
echo,原字串--%%I
echo,驱动器--"%%~dI"
echo,路 径--"%%~pI"
echo,文件名--"%%~nI"
echo,扩展名--"%%~xI"
)
pause
--------------分割线--------------
执行test.bat,CMD窗口显示如下:
同样地,for首先会将字串"x:\abc\\def//g.txt " 当作文件路径来处理,并将该字串赋值给变量%%I,%%~dI、%%~pI、%%~nI、%%~xI是提取该字串中的驱动器号(x:)、路径(\abc\def\)、文件名(g)及扩展名(.txt)
注意,扩展名包含点号(.)
细心的你还注意到,如果将得到的%%~dI、%%~pI、%%~nI、%%~xI拼接起来(即%%~dI%%~pI%%~nI%%~xI),结果就和上例(二)中的%%~fI一样了。
事实上,%%~fI可以写成%%~dpnxI。当然你写成%%~dI%%~pI%%~nI%%~xI也不会报错,只是显得麻烦点了。
类似的,%%~dI%%~pI可以写成%%~dpI,表示驱动器和路径的组合;%%~nI%%~xI可以写成%%~nxI,表示文件名和扩展名的组合;还有其它组合。。。
2013年06月19日 15点06分 1
level 14

2013年06月20日 13点06分 4
level 10
我顶!(此回复虽仅有两个字,却深刻的表达了回复人的深深的祝福与刻骨的情感,可谓言简意赅,一字千金,字字扣人心弦,催人泪下,足见回复人扎实的文字功底和信手拈来的写作技巧及惨绝人寰的创新能力。实在是佩服佩服!再加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题,把回复人的感情表达得淋漓尽致,给人无限感动和惆怅,有浑然天成之感,实属回复中之极品,祝福中之绝笔)
2013年06月20日 14点06分 5
level 9
mark火钳流明
2013年06月21日 00点06分 6
level 9
2013年06月24日 07点06分 7
level 12
2013年06月26日 00点06分 8
level 9
顶起来啊,果然是好文章,我最需要的东西哦
2013年11月20日 03点11分 9
好人。。。把这么好的帖子顶起来,不然我还不知道呢~[真棒]
2013年11月20日 04点11分
这么好的帖子确实应该被看到,但下次还是注意一下不要挖坟吧……
2013年11月20日 05点11分
我正好找这方面的东西,发现就在吧里,不能沉了啊
2013年11月20日 05点11分
level 5
写的不错 顶下吧
2014年02月12日 09点02分 10
挖坟。。。。。竟然没关注?
2014年02月12日 10点02分
封禁1天
2014年02月12日 10点02分
level 11
听说挖坟是15天
2014年02月23日 03点02分 11
level 9
挖掘機學校哪家強,中國山東找藍翔!
2014年02月23日 10点02分 12
level 9

2014年02月24日 09点02分 13
level 11

2014年02月24日 14点02分 14
level 6
顶顶更健康……[真棒]
2014年08月24日 11点08分 17
level 6
顶顶更健康……[真棒]
2014年08月24日 11点08分 18
level 7
赞!!!!!!!!!!!!![haha]
2015年01月28日 00点01分 19
level 7
顶上去!!!!!!!!!!!!!!!!!![真棒]
2015年06月01日 09点06分 20
level 1
32个赞,很详细,很全面啊 [真棒]
2015年10月16日 01点10分 21
level 1
对于初学者来说确实,通俗易懂,感谢分享。
2017年08月22日 07点08分 22
level 1
dd
2021年06月23日 01点06分 25
1