中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结] for语句里的变量参照怎么用?
« [1] [2] »
作者:
标题: [已结] for语句里的变量参照怎么用? 上一主题 | 下一主题
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『楼 主』:  [已结] for语句里的变量参照怎么用?

学习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 ]

2006-6-23 20:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 2 楼』:  虽然我说亲点版主

虽然我说亲点版主,可他可能不在 `-`

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

多谢了。:D

2006-6-23 20:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wydos
中级用户





积分 304
发帖 117
注册 2006-4-4
状态 离线
『第 3 楼』:  

本人的理解是:
%I假如包含文件名和扩展名,用了%~nI,就可以把扩展名去掉.如果%I本身若只有文件名,%~nI将会出错.
这只是本人的粗略理解,仅供参考哦!!

2006-6-23 21:35
查看资料  发送邮件  发短消息 网志  OICQ (327337973)  编辑帖子  回复  引用回复
arding
初级用户





积分 90
发帖 38
注册 2006-1-6
状态 离线
『第 4 楼』:  

for %%i in (dir d:\temp\1.txt) do echo %%~zi

2006-6-26 12:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 5 楼』:  

多谢arding啊。哈哈你说的语句真的是对的。

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


你能帮我把另外一个问题解决了吗?
如果两个文件夹A和B。  我要判断出哪些文件是B里具有的而在A中却没有。

2006-6-26 12:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
arding
初级用户





积分 90
发帖 38
注册 2006-1-6
状态 离线
『第 6 楼』:  

下面的批处理用于不同文件夹下的同名文件的比较,你可以改动 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=


2006-6-26 13:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 7 楼』:  

"我发现用%~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

2006-6-26 13:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 8 楼』:  

你的标题不符合规范,请参照本版置顶贴自行更改,否则将酌情给予处罚。

  Quote:
如果两个文件夹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 指定该参数表示目标目录包含子目录

2006-6-26 13:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 9 楼』:  

非常感谢6-8楼的回复,使我又学到了一些知识。

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

你们都是dos高手啊,哎。佩服。

2006-6-27 01:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 10 楼』:  

Re zhaxi:

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

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

      另外,点名提问的行为会使被点名和不被点名的人都产生一定的反感,这属于提问的忌讳之一,所以在你修改标题之前,我未做任何的回复,就是希望你能意识到这个问题。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-27 01:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 11 楼』:  

你的语句太有新意了。不过我今天拿出执行了一下,发现怎么把相同的文件记录都输入到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

2006-6-28 12:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 12 楼』:  

Sorry,没有仔细看你的要求,上面的代码只能列出两个目录都有的文件列表,不过要想修改成 A有B没有 其实也不难,只需要把for那一行中的 "&&" 替换为 "||" 即可。
至于相对路径,本版已经有过相关讨论。可以参考: [已结]如何获得文件的上一层目录名字

2006-6-28 13:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xiongwei2624
初级用户





积分 96
发帖 44
注册 2006-6-26
来自 深圳
状态 离线
『第 13 楼』:  

感谢!

2006-6-28 14:45
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (3099591)  编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 14 楼』:  

晕。只需要把 &&改成  || 就可以了啊。

不过我也忘记说明白点,A和B都是具有三级子文件夹的。所以我为了取出每个相同文件夹A中有B中没有的文件名列表,今天一天浪费了很长时间才写了个能实现此需求的程序,看起来比你的复杂的多。明天我把它发上来吧。

2006-6-28 19:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 15 楼』:  

刚才电脑启动不了。出现提示: NTLDR is missing,.... press any key
我插了光盘进入故障恢复台,
copy g:\i386\ntldr c:\
copy g:\i386\ntdetect.com c:\
哈哈,居然成功进入了系统。不过发现启动菜单成了英文的拉。于是又把光盘里的bootfont.bin拷贝到了C盘,也解决了显示问题。

哈哈,首次体验批处理语句的快感!

2006-6-28 21:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: