无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4469|回复: 5
打印 上一主题 下一主题

FOR命令中的变量扩展简单说明

[复制链接]
跳转到指定楼层
1#
发表于 2011-12-18 00:36:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
网上找到些资料,都不是很全,有些还有错误。闲着没事,重新将之整理了下,分享给需要的朋友。如果有错误和不足之处,还请指出来,我好重新修改,谢谢!

(一)%~I——删除全部引号("),扩展 %I(微软解释。下同)

先看这个例子:
复制下面内容,保存为c:\temp.txt,内容如下:
--------------分割线--------------
"1111

2222"
"3333"
"44"44
--------------分割线--------------

然后复制下面代码,保存为BAT文件,随便保存到哪里都行。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN (c:\temp.txt) DO @echo %%~I>>c:\temp1.txt
PAUSE
--------------分割线--------------

双击该BAT文件,会生成c:\temp1.txt文本文件,temp1.txt内容如下:
--------------分割线--------------
1111
2222"
3333
44"44
--------------分割线--------------

与之前temp.txt中的内容比较,会发现temp1.txt第一行和第三行的引号消失,这就是%~I删除引号的作用。

引号删除规则为(欢迎补充完善):
1.若字符串首部存在引号,首部的引号将被删除;
2.若字符串首尾同时存在引号,则同时删除首尾的引号;
3.若引号出现在字符串首部和中间,则只删除字符串首部的引号;
4.若引号只出现在字符串中间或者只出现在尾部,则引号不被删除。

(二)%~fI——将 %I 扩展到一个完全合格的路径名

复制下面代码,假设保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~fI
Pause
--------------分割线--------------

执行后显示内容如下:
C:\Documents and Settings\Administrator\桌面\test.bat
若将代码中的 %%~fI直接改成%%I,执行后显示内容如下
test.bat

因此,如果%I变量的内容是一个文件名,%~fI就会将该文件扩展成文件所在的绝对路径+文件名,而不仅仅是文件名。

(三)%~dI——仅将 %I 扩展到一个驱动器号

复制下面代码,同样保存到桌面,命名为test.bat文件。
--------------分割线--------------

@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~dI
Pause
--------------分割线--------------

执行test.bat后CMD窗口显示如下:
C:

因此,如果变量%%I代表的是一个文件或者目录,%%~dI就会将该文件或者目录扩展成文件或目录所在的盘符号(C: D: E:等等)。

(四)%~pI——仅将 %I 扩展到一个路径

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~pI
Pause
--------------分割线--------------

执行test.bat后显示内容如下:
\Documents and Settings\Administrator\桌面\

可以看出,%~pI用法和(二)中的%~fI类似,%~pI是将%I变量代表的文件扩展成该文件所在的绝对路径(不含驱动器号和文件名)。

(五)%~nI——仅将 %I 扩展到一个文件名

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~nI
Pause
--------------分割线--------------

执行test.bat后显示内容如下:
test

因此,%~nI是将%I变量所代表的文件扩展成该文件的前缀名,不含点号(.)与扩展名。

(六)%~xI——仅将 %I 扩展到一个文件扩展名

这个与上面(五)中的%~nI作用相反,即:只扩展成点号(.)+扩展名。

(七)%~sI——扩展的路径只含有短名

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~sI
Pause
--------------分割线--------------

执行test.bat后显示内容如下:
C:\DOCUME~1\ADMINI~1\桌面\TEST.BAT

可以看出,%~sI的作用就是将%I变量代表的文件扩展成该文件所在的短文件路径名。

(八)%~aI——将 %I 扩展到文件的文件属性

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~aI
Pause
--------------分割线--------------

执行test.bat后显示结果如下:
--a------

可以看出,%~aI的作用就是将%I变量代表的文件扩展成该文件的属性(a代表存档,s代表系统,h代表隐藏,r代表只读,等)。

(九)%~tI——将 %I 扩展到文件的日期/时间

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~tI
Pause
--------------分割线--------------

执行后显示内容如下:
2011-12-15 17:41

因此,%~tI会将%I变量代表的文件扩展成该文件的修改日期与时间。

(十)%~zI——将 %I 扩展到文件的大小

复制下面代码,保存到桌面,命名为test.bat文件。
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ('dir /a /b test.*') DO @echo %%~zI
Pause
--------------分割线--------------

执行后显示内容如下:
34

因此,%~zI会将%I变量所代表的文件扩展成该文件的大小(单位:字节)。

(十一)%~$PATH:I——查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串。

复制下面代码,保存到桌面,命名为test.bat文件:
--------------分割线--------------
@echo off
FOR /F "delims=" %%I IN ("explorer.exe") DO @echo %%~$PATH:I
Pause
--------------分割线--------------

执行test.bat后CMD窗口显示结果如下:
C:\windows\explorer.exe

(说明:%~$PATH:I中的PATH可以用其它变量替代。如%~$aa:I,前提是%aa%事先已做过定义)

因此,%~$PATH:I是在%PATH%变量定义的路径里搜索指定的文件,如果文件存在,%~$PATH:I会被扩展成该文件所在的绝对路径名。如果%PATH%路径下没找到文件,%~$PATH:I将被扩展成空值,同时显示错误:ECHO处于关闭状态。

以上从(一)到(十一)的变量%I可以用其它替代,如%a或%i等。扩展变量符也可以组合使用,如: %~dpI、%~nxI等等。例子不举了,输入FOR /? 就明白用法了。




[ 本帖最后由 pznpt 于 2011-12-18 19:23 编辑 ]

评分

参与人数 1无忧币 +20 收起 理由
zhs509 + 20 感谢分享!

查看全部评分

6#
 楼主| 发表于 2011-12-19 01:31:21 | 只看该作者
举一个扩展变量的实例:统计某目录下大于10MB的文件数量,并且列出清单。
@echo off
setlocal enabledelayedexpansion
set b=0&echo 文件清单(大于10MB)>test.txt
(echo.
for /f "delims=" %%i in ('dir /a-d /b /s *.*') do if %%~zi geq 10485760 set /a b+=1&echo 路径: "%%~dpi" 文件名: "%%~nxi" 大小: %%~zi字节
if "!b!"=="0" (echo "%~dp0"及其子目录下没找到文件) else echo.&echo 总计: !b!个文件)>>test.txt
echo.&echo 结果保存在"%~dp0test.txt"
pause

[ 本帖最后由 pznpt 于 2011-12-19 09:00 编辑 ]
回复

使用道具 举报

5#
 楼主| 发表于 2011-12-18 20:13:01 | 只看该作者

回复 #4 my9823 的帖子

呵呵,我也是正在努力学习中的菜菜鸟,知道的并不多呢。

截取变量貌似可以这样:
set aa=abcd12345
echo %aa:~1,3%

就会截取abcd12345中的从第2位(偏移1)开始的后面3位,即:bcd
如果换成%aa:~0,3%,会截取第一位开始的后3位,即:abc
换成%aa:~3%,会截取第4位开始的后面的位,即:d12345
换成%aa:0,~-3%,会截取第1位开始的后面的位,后面的3位不截,即:abcd12
换成%aa:~-3%,会截取后面的3位,即:345

具体可查看 set /?
回复

使用道具 举报

4#
发表于 2011-12-18 16:29:35 | 只看该作者
楼主接着讲下变量的截取吧?
回复

使用道具 举报

3#
发表于 2011-12-18 12:29:43 | 只看该作者
好贴,值得研究和收藏,继续关注
回复

使用道具 举报

2#
发表于 2011-12-18 05:53:50 | 只看该作者
这些说明很值得收藏的啊支持了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-2-26 07:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表