标题: [其他] 这两个批处理语句的用法是怎样的? [打印本页]
作者: 441857769@qq.co 时间: 2013-7-23 16:33 标题: 这两个批处理语句的用法是怎样的?
刚学批处理,今天在论坛上看到一个贴子,有两句没看懂,求大神讲解下 %%~和dir /a-d /s /b "%%a:\*%FileName%" 2^>nul 不是很明白
其一%%b不是就可以直接引用参数b了,为什么还要加上~nx
其二 dir /a-d 这个参数是什么意思。 dir /?中没看到 后面接 %%a:\*%FileName%" 2 这个 * 和后面2 是什么意思。 整句有点不明白。
原帖子内容如下:- @echo off
- rem 指定待搜索的文件
- set "FileName=log.txt"
- echo 正在搜索,请稍候...
- for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
- if exist %%a:\nul (
- for /f "delims=" %%b in ('dir /a-d /s /b "%%a:\*%FileName%" 2^>nul') do (
- if /i "%%~nxb" equ "%FileName%" (
- echo.%%b
- )
- )
- )
- )
- pause
复制代码
作者: CrLf 时间: 2013-7-23 18:22
在这个格式中:
for /f "参数" %%a in ('命令') do 复合语句
执行 命令 的时候实际上是启动了一个 cmd,并把 命令 作为参数传递给 cmd,实际执行的是像这样的:
cmd /c 命令
你例子中的 > 是参数的一部分,所以需要转义为普通字符串,把它保留到 for /f 启动的那个 cmd 中去解析,否则会引起语法错误。
因为双引号也有转义效果,所以也可以写成这样:- for /f "delims=" %%b in ('"dir /a-d /s /b "%%a:\*%FileName%" 2>nul"') do
复制代码
%%~nxb 的意思是获取 %%b 的文件全名(含文件名与后缀名),可参阅 for /f 中的解释:
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:
%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩展到一个驱动器号和路径
%~nxI - 仅将 %I 扩展到一个文件名和扩展名
%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。
作者: CrLf 时间: 2013-7-23 18:25
for 是最难学也是最有用的命令,学会之后再回头看看其实也是很简单的,只要理解了几个概念就易如反掌
学 for 建议看这个:
http://bbs.bathome.net/thread-2189-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |