Board logo

标题: [文本处理] [已解决]批处理获取文件大小在括号的外面该咋弄呢? [打印本页]

作者: wh1234567    时间: 2011-5-24 11:11     标题: [已解决]批处理获取文件大小在括号的外面该咋弄呢?

  1. @echo off
  2. for %%i in ("1.txt") do (
  3. set "fz=%%~zi"
  4. setlocal enabledelayedexpansion
  5. if !fz! lss 1024 (
  6. echo !fz! Byte
  7. ) else (
  8. if !fz! lss 1048576 (
  9. set /a fz=!fz!/1024&echo !fz! KB
  10. ) else (
  11. set /a fz=!fz!/1048576&echo !fz! MB
  12. )
  13. )
  14. endlocal
  15. )
  16. echo 文件大小为
  17. pause
复制代码
要求:echo 文件大小为   这个在括号的外面
并要求保留两位小数,和文件的实际大小要一样的那种
作者: techon    时间: 2011-5-24 13:42

本帖最后由 techon 于 2011-5-25 22:38 编辑

setlocal 和 endlocal 应该放在for 外面
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in ("a.bat") do (
  4.          set fz=%%~zi
  5.          if !fz! lss 1024 (
  6.                  echo !fz! Byte
  7.          ) else (
  8.                  if !fz! lss 1048576 (
  9.                          call :_div !fz! 1024 2
  10.                          set fz=!quo!KB&echo !fz!
  11.                  ) else (
  12.                          call :_div !fz! 1048576 2
  13.                          set fz=!quo!MB&echo !fz!
  14.                  )
  15.          )
  16. )
  17. echo 文件大小为 %fz%
  18. endlocal
  19. pause&goto :EOF
  20. rem 除法计算子程序
  21. :_div
  22.   if "%1"=="" echo 请输入被除数(参数 %%^1)&goto :EOF
  23.   if "%2"=="" echo 请输入除数(参数 %%^2)&goto :EOF
  24.   SETLOCAL ENABLEDELAYEDEXPANSION
  25.   set Maxd=2147483647&set scp=0&set ded=%1&set dvr=%2&set quo=&set psc=%3
  26.   if "%psc%"=="" set psc=%Maxd%
  27.   if %dvr% equ 0 ENDLOCAL&echo 错误,除数为零!&goto :EOF
  28.   if %ded% equ 0 ENDLOCAL&set quo=0&goto :EOF
  29.   if "%ded%"=="%1" (
  30.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  31.   ) else (
  32.     echo 参数 %%^1 输入错误或数值超限
  33.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  34.   )
  35.   :divbg
  36.   set/a quo=ded/dvr, rdd=quo*dvr
  37.   if %rdd% neq %ded% (
  38.     if %ded% leq %Maxd:~0,-1% (
  39.       if %scp% lss %psc% set ded=%ded%0&set/a scp+=1&goto :divbg
  40.     )
  41.   )
  42.   if %quo% equ 0 ENDLOCAL&set quo=0&goto :EOF
  43.   if %scp% neq 0 (
  44.     if "!quo:~-%scp%!"=="!quo!" (
  45.       set quo=00000000%quo%&set quo=0.!quo:~-%scp%!
  46.     ) else (
  47.       set quo=!quo:~0,-%scp%!.!quo:~-%scp%!
  48.     )
  49.   )
  50.   ENDLOCAL&set quo=%quo%
  51. goto :EOF
复制代码

作者: batman    时间: 2011-5-24 17:34

要求:echo 文件大小为   这个在括号的外面

楼主真的不爱学习的态度让我我再次无语。。。
作者: wh1234567    时间: 2011-5-25 18:23

2# techon

高手就是高手啊,为什么MB以上的文件提示运算符不存在呢,是不是需要修改一下呢
作者: techon    时间: 2011-5-25 22:30

本帖最后由 techon 于 2011-5-25 22:33 编辑
2# techon

高手就是高手啊,为什么MB以上的文件提示运算符不存在呢,是不是需要修改一下呢
wh1234567 发表于 2011-5-25 18:23


高手 不敢当,其实你自己好好弄也能弄好

这行
  1.                          set /a fz=!quo!MB&echo !fz!
复制代码
set /a 改为set
作者: wh1234567    时间: 2011-5-25 22:55

本帖最后由 wh1234567 于 2011-5-25 23:57 编辑

5# techon
非常感谢高手,顺便问问这个批处理可以查看任意文件大小吗?例如GB级的文件,哦明白了,要想查看GB就得再加GB的代码吧
作者: Batcher    时间: 2011-5-25 23:53

6# wh1234567


可以自己写大数运算的代码,也可以调用VBS来计算。
作者: wh1234567    时间: 2011-5-26 00:59

本帖最后由 wh1234567 于 2011-5-26 01:12 编辑

我将这个查看文件大小的批处理添加到我的另外一个批处理里,命令代码很多个,当这个命令处理完毕后就不能自动进入下一个命令,请问如何弄啊?哪里需要修改一下,我的那个批处理代码里没有一个标签,所以就自动逐一执行命令,但执行到这个批处理命令时就再执行不下去了,需要如何修改?
能不能将
echo 文件大小为 %fz%
pause
这2行放到代码的最后面?咋修改一下且不影响换算效果呢
作者: Batcher    时间: 2011-5-26 01:00

8# wh1234567


完整的代码贴出来看看?
作者: wh1234567    时间: 2011-5-26 01:14

本帖最后由 wh1234567 于 2011-5-26 01:19 编辑

将中间的
echo 文件大小为 %fz%
endlocal
pause&goto :EOF
这3行去掉。
能不能将
echo 文件大小为 %fz%
pause
这2行放到代码的最后面?咋修改一下且不影响换算效果呢,
作者: techon    时间: 2011-5-26 02:00

本帖最后由 techon 于 2011-5-26 02:06 编辑

echo 文件大小为 %fz%
去掉 endlocal
pause
去掉 &goto :EOF

变为
echo 文件大小为 %fz%
pause


确保将这部分放到你的文件的最后部分,也就是你的代码后面
  1. rem 注意这行 goto :EOF
  2. goto :EOF
  3. rem 除法计算子程序
  4. :_div
  5.   if "%1"=="" echo 请输入被除数(参数 %%^1)&goto :EOF
  6.   if "%2"=="" echo 请输入除数(参数 %%^2)&goto :EOF
  7.   SETLOCAL ENABLEDELAYEDEXPANSION
  8.   set Maxd=2147483647&set scp=0&set ded=%1&set dvr=%2&set quo=&set psc=%3
  9.   if "%psc%"=="" set psc=%Maxd%
  10.   if %dvr% equ 0 ENDLOCAL&echo 错误,除数为零!&goto :EOF
  11.   if %ded% equ 0 ENDLOCAL&set quo=0&goto :EOF
  12.   if "%ded%"=="%1" (
  13.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  14.   ) else (
  15.     echo 参数 %%^1 输入错误或数值超限
  16.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  17.   )
  18.   :divbg
  19.   set/a quo=ded/dvr, rdd=quo*dvr
  20.   if %rdd% neq %ded% (
  21.     if %ded% leq %Maxd:~0,-1% (
  22.       if %scp% lss %psc% set ded=%ded%0&set/a scp+=1&goto :divbg
  23.     )
  24.   )
  25.   if %quo% equ 0 ENDLOCAL&set quo=0&goto :EOF
  26.   if %scp% neq 0 (
  27.     if "!quo:~-%scp%!"=="!quo!" (
  28.       set quo=00000000%quo%&set quo=0.!quo:~-%scp%!
  29.     ) else (
  30.       set quo=!quo:~0,-%scp%!.!quo:~-%scp%!
  31.     )
  32.   )
  33.   ENDLOCAL&set quo=%quo%
  34. goto :EOF
复制代码

作者: wh1234567    时间: 2011-5-26 02:09

本帖最后由 wh1234567 于 2011-5-26 02:23 编辑

11# techon


不行,被pause&goto :EOF这个执行完毕后就阻止了,无法继续下面其他命令,我的批处理代码里每个命令都没有pause,只有在最后面才有这个pause,如果将这段代码放在最后不就等于无效了吗,如果放在pause的前面的话这个换算的代码也无效了好像,我的意思是只有将你写好的这个完整代码归纳在一起,只是将
echo 文件大小为 %fz%
pause
修改后放在你的代码的最后面,然后我才能顺利添加到我的代码里,要求你的代码中间去掉pause
作者: techon    时间: 2011-5-26 02:34

本帖最后由 techon 于 2011-5-26 02:37 编辑
如果将这段代码放在最后不就等于无效了吗,如果放在pause的前面的话这个换算的代码也无效了好像

谁说的?在前面要用到 call :_div

还是没听懂我的意思
把下面这段代码放到你批处理的最后
  1. rem 注意这行 goto :EOF
  2. goto :EOF
  3. rem 除法计算子程序
  4. :_div
  5.   if "%1"=="" echo 请输入被除数(参数 %%^1)&goto :EOF
  6.   if "%2"=="" echo 请输入除数(参数 %%^2)&goto :EOF
  7.   SETLOCAL ENABLEDELAYEDEXPANSION
  8.   set Maxd=2147483647&set scp=0&set ded=%1&set dvr=%2&set quo=&set psc=%3
  9.   if "%psc%"=="" set psc=%Maxd%
  10.   if %dvr% equ 0 ENDLOCAL&echo 错误,除数为零!&goto :EOF
  11.   if %ded% equ 0 ENDLOCAL&set quo=0&goto :EOF
  12.   if "%ded%"=="%1" (
  13.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  14.   ) else (
  15.     echo 参数 %%^1 输入错误或数值超限
  16.     if not "%dvr%"=="%2" ENDLOCAL&echo 参数 %%^2 输入错误或数值超限&goto :EOF
  17.   )
  18.   :divbg
  19.   set/a quo=ded/dvr, rdd=quo*dvr
  20.   if %rdd% neq %ded% (
  21.     if %ded% leq %Maxd:~0,-1% (
  22.       if %scp% lss %psc% set ded=%ded%0&set/a scp+=1&goto :divbg
  23.     )
  24.   )
  25.   if %quo% equ 0 ENDLOCAL&set quo=0&goto :EOF
  26.   if %scp% neq 0 (
  27.     if "!quo:~-%scp%!"=="!quo!" (
  28.       set quo=00000000%quo%&set quo=0.!quo:~-%scp%!
  29.     ) else (
  30.       set quo=!quo:~0,-%scp%!.!quo:~-%scp%!
  31.     )
  32.   )
  33.   ENDLOCAL&set quo=%quo%
  34. goto :EOF
复制代码
这后面的代码不会被执行
除非这后面有标签 前面有goto 标签或call 标签
作者: wh1234567    时间: 2011-5-26 02:55

本帖最后由 wh1234567 于 2011-5-26 03:04 编辑

13# techon

终于搞定了,太感谢大师了,
另外再请教一个问题:
for /f "tokens=1* delims= " %%a in ('find /v /c "" %dkou%_%smfs%已整理_%max%_[%curtime%].txt') do for /f "tokens=1,2 delims=:" %%c in ("%%b") do ren "%%c" "%%~nc_%%d行.txt"
这段代码是给文件重命名的(是给变量文件名%dkou%_%smfs%已整理_%max%_[%curtime%].txt添加一个行数为新的文件名),我想再在最后面加一个在DOS窗口上也同时显示的功能:

echo 新文件名为:%xxx%
pause
的功能,如何实现?是不是算是取文件名为变量?咋弄呢
作者: techon    时间: 2011-5-26 13:44

... 请楼上自己动动脑子好不好?

ren 是重命名命令 用法  ren 原文件名 新文件名




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