中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【求助】如何获得当前目录中文件大小最大的文件的名字
楼 主 【求助】如何获得当前目录中文件大小最大的文件的名字 发表于 2007-04-24 08:59 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
我想获得当前目录中文件大小最大的文件的名字。

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

为什么for中的set没有执行到啊?
谢谢。
2 发表于 2007-04-24 09:35 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
首先 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%不是在开始时就赋值;而是随着程序的执行而改变;

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

所以正确代码如下



  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-04-24 21:36
3 发表于 2007-04-24 09:38 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
非常感谢!
java 用贯了。哈哈。
4 发表于 2007-04-24 10:36 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
又有新的问题了,怎样排出某个(某些)特定的文件?(比如:Unwiz.exe, Un2install.exe)
感激。
5 发表于 2007-04-24 11:33 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
@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
)
6 发表于 2007-04-24 12:06 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
还可以利用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-04-28 12:51
7 发表于 2007-04-24 12:17 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
To bjsh:

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

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



@echo off
for /l %%a in (1,1,10) do (
if "%%a"=="7" goto :end
echo/%%a
:end
)
pause
8 发表于 2007-04-24 12:35 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
确实;谢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 ]
9 发表于 2007-04-24 13:54 ·  中国 广东 广州 白云区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
UID 75048
性别 男
状态 离线
感觉还是使用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-04-24 21:36
10 发表于 2007-04-24 14:14 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
Originally posted by dikex at 2007-4-24 00:54:
感觉还是使用dir来完成的效率较高,不过6楼的dir的参数貌似错了,变成了按日期排列-_-

不好意思,又笔误了。

多谢兄细心的观察,代码已经修正。
11 发表于 2007-04-24 21:33 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
非常感谢大家的回答。

本来是想注册个马甲问完问题就闪~看来要好好来这里学学dos了~哈哈
12 发表于 2007-04-24 21:35 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
继续出难题:
如果我想排除 un 开头的所有 exe 呢?
13 发表于 2007-04-24 21:40 ·  中国 广东 湛江 电信
新手上路
积分 14
发帖 6
注册 2007-04-24 08:28
UID 86274
性别 男
状态 离线
系统提示:对不起,您最近 24 小时评分数超过 2 点 限制,请返回。

今天不能给大家的帖子一一评分了。
:)
14 发表于 2007-04-24 23:32 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 302
发帖 138
注册 2007-03-29 02:33
UID 83224
性别 男
状态 离线
呵呵 前面看到lxmxn兄还是铂金,一下子荣升斑竹,恭喜恭喜,还有就是bjsh兄终于修成正果,特来祝贺.
不过我来这里关键是学习的,所以特问有没有有关dir参数的贴子以供学习.
15 发表于 2007-04-24 23:44 ·  中国 广东 广州 白云区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
UID 75048
性别 男
状态 离线
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-04-28 12:51
论坛跳转: