标题: [已结] for语句里的变量参照怎么用?
[打印本页]
作者: zhaxi
时间: 2006-6-23 20:06
标题: [已结] 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 ]
作者: zhaxi
时间: 2006-6-23 20:09
标题: 虽然我说亲点版主
虽然我说亲点版主,可他可能不在 `-`
其他批处理 高手见了也希望能帮帮我啊。
多谢了。:D
作者: wydos
时间: 2006-6-23 21:35
本人的理解是:
%I假如包含文件名和扩展名,用了%~nI,就可以把扩展名去掉.如果%I本身若只有文件名,%~nI将会出错.
这只是本人的粗略理解,仅供参考哦!!
作者: arding
时间: 2006-6-26 12:24
for %%i in (dir d:\temp\1.txt) do echo %%~zi
作者: zhaxi
时间: 2006-6-26 12:59
多谢arding啊。哈哈你说的语句真的是对的。
我以前写成了for %%i in (d:\temp\1.txt) do echo %%~zi ,居然要加个DIR.
你能帮我把另外一个问题解决了吗?
如果两个文件夹A和B。 我要判断出哪些文件是B里具有的而在A中却没有。
作者: arding
时间: 2006-6-26 13:13
下面的批处理用于不同文件夹下的同名文件的比较,你可以改动 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=
作者: GOTOmsdos
时间: 2006-6-26 13:16
"我发现用%~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
作者: 3742668
时间: 2006-6-26 13:38
你的标题不符合规范,请参照本版置顶贴自行更改,否则将酌情给予处罚。
如果两个文件夹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 指定该参数表示目标目录包含子目录
作者: zhaxi
时间: 2006-6-27 01:04
非常感谢6-8楼的回复,使我又学到了一些知识。
to 6楼: 你写的这些语句暂时我还看不懂,哈哈。仔细研究几天再说。
to 7楼: 你很细心,我正好不明白%~z0 和%%是什么意思。
to 8楼: 你就是版主啊,一直没来回帖。 至于标题不规范,因为这是我首次发贴,没有意识。我已经改了不知道是不是正确格式。
你们都是dos高手啊,哎。佩服。
作者: willsort
时间: 2006-6-27 01:18
Re zhaxi:
建议你再多看看置顶的版规和其中的关于提问和发帖的主题链接吧。
提问的第一要素,要让人清楚明白的知道你的问题是什么,这其中标题就是关键,在其中你应该尽量简短的文字尽量准确的说明你的问题,而不是使用“最难受”等富有感情却毫无内容的字眼。
另外,点名提问的行为会使被点名和不被点名的人都产生一定的反感,这属于提问的忌讳之一,所以在你修改标题之前,我未做任何的回复,就是希望你能意识到这个问题。
作者: zhaxi
时间: 2006-6-28 12:55
你的语句太有新意了。不过我今天拿出执行了一下,发现怎么把相同的文件记录都输入到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
作者: 3742668
时间: 2006-6-28 13:13
Sorry,没有仔细看你的要求,上面的代码只能列出两个目录都有的文件列表,不过要想修改成 A有B没有 其实也不难,只需要把for那一行中的 "&&" 替换为 "||" 即可。
至于相对路径,本版已经有过相关讨论。可以参考:
如何获得文件的上一层目录名字
作者: xiongwei2624
时间: 2006-6-28 14:45
感谢!
作者: zhaxi
时间: 2006-6-28 19:41
晕。只需要把 &&改成 || 就可以了啊。
不过我也忘记说明白点,A和B都是具有三级子文件夹的。所以我为了取出每个相同文件夹A中有B中没有的文件名列表,今天一天浪费了很长时间才写了个能实现此需求的程序,看起来比你的复杂的多。明天我把它发上来吧。
作者: zhaxi
时间: 2006-6-28 21:12
刚才电脑启动不了。出现提示: NTLDR is missing,.... press any key
我插了光盘进入故障恢复台,
copy g:\i386\ntldr c:\
copy g:\i386\ntdetect.com c:\
哈哈,居然成功进入了系统。不过发现启动菜单成了英文的拉。于是又把光盘里的bootfont.bin拷贝到了C盘,也解决了显示问题。
哈哈,首次体验批处理语句的快感!
作者: 3742668
时间: 2006-6-28 22:46
不过我也忘记说明白点,A和B都是具有三级子文件夹的...
参数3:/r 指定该参数表示源目录包含子目录
参数4:/s 指定该参数表示目标目录包含子目录
虽然我没有做过测试,不过不知道你做测试的时候有无加上后面两个参数。
作者: IceCrack
时间: 2006-7-10 23:01
for后()的command不是要加单引号嘛。为什么这里不要呢?
Last edited by IceCrack on 2006-7-10 at 23:03 ]