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,表示文件名和扩展名的组合;还有其它组合。。。
