Board logo

标题: [ 新手练习 8 ] 批处理计算拖放文件数 [打印本页]

作者: wxcute    时间: 2008-12-10 11:20     标题: [ 新手练习 8 ] 批处理计算拖放文件数

将一个文件(或目录)拖放到批处理图标上,这个文件的完整路径将被做为参数 %1。
现在我们来思考一下,如果拖入的文件不止一个,怎么来计算到底拖放了几个文件呢?
  1. ::示例
  2. @echo off
  3. echo 完整路径:%1
  4. echo 文件全名:%~nx1
  5. pause
复制代码
提示:可能用到 shift 或者 for,也可能二者兼用。

要求:显示拖放到批处理上的文件的数目。
   方法不限。

评分:代码可读性 1 分;
   首个新方法 7 分,第二个 5 分,依次类推,最少 3 分;
   一人可多种方法,新方法追加 3 分,已经出现过的方法追加 1 分。
作者: rat    时间: 2008-12-10 13:16

@(for %%a in (%*)do @set/an+=1)&call echo.%%n%%&pause
作者: tireless    时间: 2008-12-10 13:50

  1. @echo off
  2. :loop
  3. shift
  4. if "%~0" neq "" set /a "n+=1" & goto loop
  5. echo 拖入了 %n% 个文件。
  6. pause
复制代码

作者: lhjoanna    时间: 2008-12-11 19:27

建议:如果不是新手,还是迟些公布自己的答案,给大家个思考的机会啊。也建议如果是新手,不管自己的代码有多粗糙,尽量还是贴出来,毕竟是自己思考的结果,并且还能得到大家的指导。
作者: RiceFans    时间: 2008-12-21 09:11

@echo off&setlocal EnableDelayedExpansion
del /f/q temp.txt >nul 2>nul
echo  文件列表:     ::::请直接把文件拖到图标上::::
:a
set "a=%~1"
if not defined a goto b
echo %~f1>>temp.txt
shift /1
goto :a
:b
set b=0
for /f "tokens=*" %%i in (temp.txt) do (
set /a b+=1
echo "%%i"
)
echo 共拖入!b!个文件或文件夹
pause>nul
作者: firewolf85    时间: 2008-12-21 11:07

经测试,上面兄弟们的方法最大支持文件数目都是65个
是否可以说明允许访问的%*最大就是%64呢??
作者: wxcute    时间: 2008-12-21 11:43     标题: 回复 6楼 的帖子

怎么会呢?是什么测试环境?我这儿是 XP SP3,没有你说的那种情况。
请列出测试环境。
作者: tireless    时间: 2008-12-21 12:44

发现也不一定是多少个 ——

我从 system32 下可以拖入 66 个文件;
我又试着新建一个文件夹,里面新建 1.txt ~200.txt,测试可以拖入 1.txt ~ 86.txt (共86个)、可以拖入 87.txt ~ 168.txt (共82个);
我又新建一文件夹,里面新建 1 ~ 100,可以拖入 1 - 79 (共79个)
......

测试环境: XP SP2 中文版

[ 本帖最后由 tireless 于 2008-12-21 13:10 编辑 ]
作者: wxcute    时间: 2008-12-21 13:03

可能与 %* 代表的字串总长度有关。现在发现 SP3 文件多了以后也会有问题,且数目不确定。
作者: sylovanas    时间: 2008-12-21 23:16

和单行字元总长度不知有无关系?
另外@()内的行数不知是否能使用超过10300行
作者: leaparde    时间: 2008-12-30 10:11

提个建议,高手发代码的时候能不能加上注解呢??
新手看高手的代码还是很吃力的,当然,可以自己不停的翻资料。但是总觉得没有注解的代码似乎缺了点什么!
作者: wxcute    时间: 2008-12-30 11:12

教科书的注解颇多,为何总是提不起人们的兴趣。
我想是留给人想象的空间太小了。
作者: leaparde    时间: 2008-12-30 12:30

受教了,虚心学习……
作者: myzwd    时间: 2009-3-1 22:16     标题: 回复 11楼 的帖子

我部分支持你的说法,编程靠的是思路,所以发代码是注释一下思路,是最好的了。
作者: myzwd    时间: 2009-3-1 22:56     标题: 回复 1楼 的帖子

  1. @echo off
  2. cls
  3. set /a n=-2
  4. call:one *.*
  5. :one
  6. set /a n+=1
  7. echo.**NAME******PATH**************TOTAL
  8. echo.%~nx1-----%~dpf1-----%n%
  9. shift
  10. if "%~nx0" neq "" goto one
  11. pause
复制代码


------------------------------------------------
  我来到这个论坛 是因为这里的题目 太有趣了,我不喜欢那些长篇的大程序,看起来头痛。而这里的新手练功区,
程序都不大,可以学到不少东西。
学习批处理其根本原因在于方便,每一台电脑都可以运行。
其实学习难道挺大的。

[ 本帖最后由 myzwd 于 2009-3-1 23:09 编辑 ]
作者: Batcher    时间: 2009-3-2 11:33     标题: 回复 15楼 的帖子

其实要做到“每一台电脑都可以运行”,还是考虑很多情况的,并不是一件容易的事情。
作者: BHsolve    时间: 2013-12-29 17:19

本帖最后由 BHsolve 于 2013-12-29 17:20 编辑
  1. @echo off
  2. set /a n=-1
  3. :loop
  4. shift
  5. set /a n+=1
  6. if exist "%~nx0" (
  7. goto loop
  8. )else (
  9. goto end
  10. )
  11. :end
  12. echo 拖入%n%个文件
  13. pause
复制代码
查错花了好长时间




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2