Board logo

标题: 【求助】如何获得当前目录中文件大小最大的文件的名字 [打印本页]

作者: bugmenot     时间: 2007-4-24 08:59    标题: 【求助】如何获得当前目录中文件大小最大的文件的名字

我想获得当前目录中文件大小最大的文件的名字。
set /a filesize = 0
for %%2 in (*.exe) do if %filesize% LSS %%~z2 set filesize = %%~z2 & echo %%2 > exefilelist.txt
为什么for中的set没有执行到啊?
谢谢。
作者: bjsh     时间: 2007-4-24 09:35
首先 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


作者: bugmenot     时间: 2007-4-24 09:38
非常感谢!
java 用贯了。哈哈。
作者: bugmenot     时间: 2007-4-24 10:36
又有新的问题了,怎样排出某个(某些)特定的文件?(比如:Unwiz.exe, Un2install.exe)
感激。
作者: bjsh     时间: 2007-4-24 11:33
@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
)
作者: lxmxn     时间: 2007-4-24 12:06
还可以利用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 ]
作者: lxmxn     时间: 2007-4-24 12:17
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

作者: bjsh     时间: 2007-4-24 12:35
确实;谢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 ]
作者: dikex     时间: 2007-4-24 13:54
感觉还是使用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

作者: lxmxn     时间: 2007-4-24 14:14


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

不好意思,又笔误了。

多谢兄细心的观察,代码已经修正。
作者: bugmenot     时间: 2007-4-24 21:33
非常感谢大家的回答。

本来是想注册个马甲问完问题就闪~看来要好好来这里学学dos了~哈哈
作者: bugmenot     时间: 2007-4-24 21:35
继续出难题:
如果我想排除 un 开头的所有 exe 呢?
作者: bugmenot     时间: 2007-4-24 21:40
系统提示:对不起,您最近 24 小时评分数超过 2 点 限制,请返回。

今天不能给大家的帖子一一评分了。
:)
作者: lililulula     时间: 2007-4-24 23:32
呵呵 前面看到lxmxn兄还是铂金,一下子荣升斑竹,恭喜恭喜,还有就是bjsh兄终于修成正果,特来祝贺.
不过我来这里关键是学习的,所以特问有没有有关dir参数的贴子以供学习.
作者: dikex     时间: 2007-4-24 23:44


  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