中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【求助】如何获得当前目录中文件大小最大的文件的名字
作者:
标题: 【求助】如何获得当前目录中文件大小最大的文件的名字 上一主题 | 下一主题
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『楼 主』:  【求助】如何获得当前目录中文件大小最大的文件的名字

我想获得当前目录中文件大小最大的文件的名字。
set /a filesize = 0
for %%2 in (*.exe) do if %filesize% LSS %%~z2 set filesize = %%~z2 & echo %%2 > exefilelist.txt
为什么for中的set没有执行到啊?
谢谢。

2007-4-24 08:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 2 楼』:  

首先 for要用单一字母来表示变量
所以%%2是不对的;而要使用%%i等字母

set "filesize=%%~za"

不要加不必要的空格;

set t = 1 是赋不了值的;需要 set t=1;
(但是 set /a t = 1 却是可以赋值的;)
为了避免不必要的空格;尽量养成
set "t=1" 加引号的习惯;

还有就是变量延迟的问题;

for在执行过程中会把其中的环境变量先替换为 其对应的值;

也就是说 for 在执行的时候是

for %%i in (*.exe) do if 0 LSS %%~z2 set "filesize=%%~z2" & echo %%i > exefilelist.txt

标记处是不变的;一直为常数0;而不会随着filesize的重定义而改变;

此时就需要用到变量延迟;以使得%filesize%不是在开始时就赋值;而是随着程序的执行而改变;

关于变量延迟的详细可以搜索旧贴;

所以正确代码如下

  Quote:

  1. @echo off &setlocal enabledelayedexpansion
  2. set /a "filesize=0"
  3. for %%i in (*.bat) do if !filesize! lss %%~zi set "filesize=%%~zi" & echo %%i >exefilelist.txt
         BJSH发表于:  2007-04-23  20:22



   此帖被 +1 点积分    点击查看详情   
评分人:【 bugmenot 分数: +1  时间:2007-4-24 21:36


2007-4-24 09:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『第 3 楼』:  

非常感谢!
java 用贯了。哈哈。

2007-4-24 09:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『第 4 楼』:  

又有新的问题了,怎样排出某个(某些)特定的文件?(比如:Unwiz.exe, Un2install.exe)
感激。

2007-4-24 10:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 5 楼』:  

@echo off &setlocal enabledelayedexpansion
set /a "filesize=0"
for %%i in (*.exe) do
(
if "%%i"=="Unwiz.exe" goto end
if "%%i"=="Un2install.exe" goto end
if !filesize! lss %%~zi set "filesize=%%~zi" & echo %%i >exefilelist.txt
:end
)

2007-4-24 11:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

还可以利用dir的/o参数来实现楼主最初的想法。
@echo off
for /f "delims=" %%a in ('dir /b/a-d/os *.exe') do echo %%a>exefilelist.txt
start exefilelist.txt
[ Last edited by lxmxn on 2007-4-24 at 01:14 AM ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 bugmenot 分数: +1  时间:2007-4-28 12:51


2007-4-24 12:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 7 楼』:  

To bjsh:

测试了一下5楼的代码,提示命令语法不正确,我想原因是for命令内部不允许使用标签。

我又用"for /l"写了个简单的批处理[1]来测试for命令内部使用标签的情况,仍然提示命令语法错误。

[1]
@echo off
for /l %%a in (1,1,10) do (
if "%%a"=="7" goto :end
echo/%%a
:end
)
pause


2007-4-24 12:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 8 楼』:  

确实;谢lxmxn指正;
现修改代码如下
@echo off &setlocal enabledelayedexpansion
set /a "filesize=0"
for %%i in (*.exe) do
(
if "%%i"=="Unwiz.exe" set "w=1"
if "%%i"=="Un2install.exe" set "w=1"
if not defined w if !filesize! lss %%~zi set "filesize=%%~zi" & echo %%i >exefilelist.txt
set "w="
)

[ Last edited by bjsh on 2007-4-23 at 11:36 PM ]

2007-4-24 12:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 9 楼』:  

感觉还是使用dir来完成的效率较高,不过6楼的dir的参数貌似错了,变成了按日期排列-_-

发一个加上了排除的
@echo off
for /f "delims=" %%i in ('dir *.exe /o-s /a-d /b') do echo Unwiz.exe Un2install.exe | find /i "%%i" || (echo %%i>exefilelist.txt & goto :next)
:next
notepad.exe exefilelist.txt


   此帖被 +1 点积分    点击查看详情   
评分人:【 bugmenot 分数: +1  时间:2007-4-24 21:36


2007-4-24 13:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by dikex at 2007-4-24 00:54:
感觉还是使用dir来完成的效率较高,不过6楼的dir的参数貌似错了,变成了按日期排列-_-

不好意思,又笔误了。

多谢兄细心的观察,代码已经修正。

2007-4-24 14:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『第 11 楼』:  

非常感谢大家的回答。

本来是想注册个马甲问完问题就闪~看来要好好来这里学学dos了~哈哈

2007-4-24 21:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『第 12 楼』:  

继续出难题:
如果我想排除 un 开头的所有 exe 呢?

2007-4-24 21:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bugmenot
新手上路





积分 14
发帖 6
注册 2007-4-24
状态 离线
『第 13 楼』:  

系统提示:对不起,您最近 24 小时评分数超过 2 点 限制,请返回。

今天不能给大家的帖子一一评分了。
:)

2007-4-24 21:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lililulula
中级用户





积分 302
发帖 138
注册 2007-3-29
状态 离线
『第 14 楼』:  

呵呵 前面看到lxmxn兄还是铂金,一下子荣升斑竹,恭喜恭喜,还有就是bjsh兄终于修成正果,特来祝贺.
不过我来这里关键是学习的,所以特问有没有有关dir参数的贴子以供学习.

2007-4-24 23:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by bugmenot at 2007-4-24 08:35 AM:
继续出难题:
如果我想排除 un 开头的所有 exe 呢?

修改一下使用findstr命令应该就可以了
@echo off
for /f "delims=" %%i in ('dir *.exe /o-s /a-d /b') do echo %%i | findstr /i /b "un" 1>nul 2>nul || (echo %%i>exefilelist.txt & goto :next)
:next
notepad.exe exefilelist.txt


   此帖被 +1 点积分    点击查看详情   
评分人:【 bugmenot 分数: +1  时间:2007-4-28 12:51


2007-4-24 23:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: