中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-22 12:04
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结] for语句里的变量参照怎么用? 查看 2,322 回复 16
楼 主 [已结] for语句里的变量参照怎么用? 发表于 2006-06-23 20:06 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
学习DOS 3个月,自己在公司编写了一些小程序了,感觉很不错。可是一直以来郁闷的一个用法还不会,而且在网上搜索几个钟头,也找不到相关文章。我知道我问的这个问题对willsort你来说很容易,一定帮我解答啊。非常感谢了。

我想问的是:for语句里的变量参照是怎么用的。
%~I 展开删除任何前后引号 ("") 的 %I。
%~fI 将 %I 展开到完全合格的路径名。
%~dI 只将 %I 展开到驱动器号。
%~pI 只将 %I 展开到路径。
%~nI 只将 %I 展开到文件名。
%~xI 只将 %I 展开到文件扩展名。
%~sI 展开路径以只包含短名称。
%~aI 将 %I 展开到文件的文件属性。
%~tI 将 %I 展开到文件的日期和时间。
%~zI 将 %I 展开到文件大小。

比如我想取出 d:\temp\1.txt 的大小,怎么使用%~zI啊。 我发现用%~z0 只能取出 运行的那个bat文件的大小。哎。你一定帮我详细介绍下这些扩展变量怎么用的。多举几个For语句例子。 小弟我好想学会。

另外请教一下: 如果一个文件夹A和B。 我要判断出哪些文件是B里具有的而在A中却没有。 这个问题是我为了编一个更新程序工具要用的。

[ Last edited by zhaxi on 2006-6-28 at 19:43 ]
2 虽然我说亲点版主 发表于 2006-06-23 20:09 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
虽然我说亲点版主,可他可能不在 `-`

其他批处理 高手见了也希望能帮帮我啊。

多谢了。:D
3 发表于 2006-06-23 21:35 ·  中国 贵州 贵阳 电信
中级用户
★★
积分 304
发帖 117
注册 2006-04-04 18:43
20年会员
UID 53325
性别 男
状态 离线
本人的理解是:
%I假如包含文件名和扩展名,用了%~nI,就可以把扩展名去掉.如果%I本身若只有文件名,%~nI将会出错.
这只是本人的粗略理解,仅供参考哦!!
4 发表于 2006-06-26 12:24 ·  中国 广东 佛山 电信
初级用户
积分 90
发帖 38
注册 2006-01-06 18:41
20年会员
UID 48522
状态 离线
for %%i in (dir d:\temp\1.txt) do echo %%~zi
5 发表于 2006-06-26 12:59 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
多谢arding啊。哈哈你说的语句真的是对的。

我以前写成了for %%i in (d:\temp\1.txt) do echo %%~zi ,居然要加个DIR.


你能帮我把另外一个问题解决了吗?
如果两个文件夹A和B。 我要判断出哪些文件是B里具有的而在A中却没有。
6 发表于 2006-06-26 13:13 ·  中国 广东 佛山 电信
初级用户
积分 90
发帖 38
注册 2006-01-06 18:41
20年会员
UID 48522
状态 离线
下面的批处理用于不同文件夹下的同名文件的比较,你可以改动 fc 的那一句,例如用exist 来判断相异的文件。
@echo off
rem 用于一次比较多个位于不同文件夹下的同名文件;
rem 将此批处理文件放在其中一个文件夹下,多选另
rem 一个文件夹下的文件拖动到此批处理即可。
set localpath=%~dps0
:here
IF "%~n1"=="" goto batend
fc /LB1 %localpath%%~nx1 %~s1>>fcresult.txt
shift
goto here
:batend
msg * 建议在记事本中 另存为... 保存备份!
start /wait fcresult.txt
del fcresult.txt
set localpath=
7 发表于 2006-06-26 13:16 ·  中国 北京 联通
铂金会员
★★★★
C++启程者
积分 5,154
发帖 1,827
注册 2003-07-18 00:00
22年会员
UID 7105
性别 男
状态 离线
"我发现用%~z0 只能取出 运行的那个bat文件的大小"
%~z0 就是 具有附加功能~z0 的参数 %0
%0 代表BAT文件本身

如下是相关的一条 CMD 语句:(在BAT中,% 要用%%)
for %a in (*.c) do @for %b in (*.cpp) do @if %~za==2242 @echo %~tb>>diff.log
如果 C后缀文件的大小等于2242,就显示CPP后缀文件的日期,并把结果写入diff.log
8 发表于 2006-06-26 13:38 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
你的标题不符合规范,请参照本版置顶贴自行更改,否则将酌情给予处罚。
如果两个文件夹A和B。 我要判断出哪些文件是B里具有的而在A中却没有...


@echo off
pushd %1
for %3 %%i in (*.*) do dir %4 "%2\%%~nxi" >nul 2>nul && echo %%~nxi>>list.txt
popd

参数1:源目录
参数2:目标目录
参数3:/r 指定该参数表示源目录包含子目录
参数4:/s 指定该参数表示目标目录包含子目录
9 发表于 2006-06-27 01:04 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
非常感谢6-8楼的回复,使我又学到了一些知识。

to 6楼: 你写的这些语句暂时我还看不懂,哈哈。仔细研究几天再说。
to 7楼: 你很细心,我正好不明白%~z0 和%%是什么意思。
to 8楼: 你就是版主啊,一直没来回帖。 至于标题不规范,因为这是我首次发贴,没有意识。我已经改了不知道是不是正确格式。

你们都是dos高手啊,哎。佩服。
10 发表于 2006-06-27 01:18 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re zhaxi:

建议你再多看看置顶的版规和其中的关于提问和发帖的主题链接吧。

提问的第一要素,要让人清楚明白的知道你的问题是什么,这其中标题就是关键,在其中你应该尽量简短的文字尽量准确的说明你的问题,而不是使用“最难受”等富有感情却毫无内容的字眼。

另外,点名提问的行为会使被点名和不被点名的人都产生一定的反感,这属于提问的忌讳之一,所以在你修改标题之前,我未做任何的回复,就是希望你能意识到这个问题。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
11 发表于 2006-06-28 12:55 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
你的语句太有新意了。不过我今天拿出执行了一下,发现怎么把相同的文件记录都输入到list.txt里去了。我现在需要把那些在A里存在在B里不存在的文件找到。并且最好把他们的绝对或者相对路径也保存下来。

这样我才能根据这个list.txt里的记录去删除那些A里的垃圾文件。

版主你明白我说的吗?希望继续赐教。


--------------------------------------引用回复--------------------------
Quote:
如果两个文件夹A和B。 我要判断出哪些文件是B里具有的而在A中却没有...




CODE: [Copy to clipboard]
--------------------------------------------------------------------------------

@echo off
pushd %1
for %3 %%i in (*.*) do dir %4 "%2\%%~nxi" >nul 2>nul && echo %%~nxi>>list.txt
popd
12 发表于 2006-06-28 13:13 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
Sorry,没有仔细看你的要求,上面的代码只能列出两个目录都有的文件列表,不过要想修改成 A有B没有 其实也不难,只需要把for那一行中的 "&&" 替换为 "||" 即可。
至于相对路径,本版已经有过相关讨论。可以参考: 如何获得文件的上一层目录名字
13 发表于 2006-06-28 14:45 ·  中国 广东 深圳 天威有线宽带(关内)
初级用户
积分 96
发帖 44
注册 2006-06-26 17:52
19年会员
UID 57603
性别 男
来自 深圳
状态 离线
感谢!
14 发表于 2006-06-28 19:41 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
晕。只需要把 &&改成 || 就可以了啊。

不过我也忘记说明白点,A和B都是具有三级子文件夹的。所以我为了取出每个相同文件夹A中有B中没有的文件名列表,今天一天浪费了很长时间才写了个能实现此需求的程序,看起来比你的复杂的多。明天我把它发上来吧。
15 发表于 2006-06-28 21:12 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
19年会员
UID 57473
性别 男
状态 离线
刚才电脑启动不了。出现提示: NTLDR is missing,.... press any key
我插了光盘进入故障恢复台,
copy g:\i386\ntldr c:\
copy g:\i386\ntdetect.com c:\
哈哈,居然成功进入了系统。不过发现启动菜单成了英文的拉。于是又把光盘里的bootfont.bin拷贝到了C盘,也解决了显示问题。

哈哈,首次体验批处理语句的快感!
论坛跳转: