Board logo

标题: [文本处理] [已解决]批处理中批量压缩文件夹时无法识别长文件名? [打印本页]

作者: csjssdhy    时间: 2009-7-4 10:33     标题: [已解决]批处理中批量压缩文件夹时无法识别长文件名?

批量压缩文件
  1. @echo off
  2. title 忆林子--批量压缩rar文件
  3. color 0a
  4. rem *********************************************************
  5. rem                在注册表中读取winrar的安装目录
  6. rem 如果已经存在临时文件,把它删除
  7. if EXIST tmp.忆林子 del tmp.忆林子
  8. rem 查询注册表中的winrar的路径值,并把它发送到临时文件中
  9. reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe" /v path>>tmp.忆林子
  10. rem 用For命令从临时文件中读取winrar的路径值,并把它保存到变量 WinRAR 中
  11. for /f "tokens=1,2,* skip=4 delims= " %%j in ('more tmp.忆林子') do set WinRAR=%%l
  12. rem 如果已经存在临时文件,把它删除
  13. if EXIST tmp.忆林子 del tmp.忆林子
  14. rem *********************************************************
  15. rem 用dir命令列出当前目录下的所有目录
  16. rem 并把它发送到for循环中,然后在for循环中调用压缩的子过程
  17. for /f "delims=" %%i in ('dir /ad /b') do call :ss %%i
  18. cls
  19. echo ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  20. echo.
  21. echo             操作成功结束,请按任意键退出该批处理...
  22. echo.
  23. echo ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  24. PAUSE>nul
  25. exit
  26. :ss
  27. set var=%*
  28. rem 即 rar a -r 压缩后的文件名.rar 目录名
  29. "%WinRAR%\rar" a -r %var%.rar %var%
  30. EndLocal
复制代码
我从网上找到这个代码,bat 可以批量压缩每个文件夹到每个单独的压缩文件,问题是压缩时许多长文件名的文件夹无法识别,漏压很多文件夹,如何解决呢

[ 本帖最后由 csjssdhy 于 2009-7-6 10:27 编辑 ]
作者: zljzsmzzx    时间: 2009-7-4 11:15

  1. "%WinRAR%\rar" a -r %var%.rar %var%
复制代码
改成
  1. "%WinRAR%\rar" a -r "%var%.rar" "%var%"
复制代码

作者: csjssdhy    时间: 2009-7-5 09:01

感谢楼上回复,我去试一下。
作者: csjssdhy    时间: 2009-7-5 11:05

大部分能解决了,不过还是有遗漏,似乎遗漏的是些特殊字符的文件名 比如文件名中含有 ' 或者&这样的文件名就漏掉了,如何能识别任意字符的文件名呢
作者: namejm    时间: 2009-7-5 11:17

  1、把 call :ss %%i 中的变量加上引号,改成 call :ss "%%i"
  2、把标签段:ss下的第一句:set var=%* 改成 set "var=%~1"
  再加上2楼的修改,应该可以搞定。
作者: zljzsmzzx    时间: 2009-7-5 19:54     标题: 回复 5楼 的帖子

  1、把 call :ss %%i 中的变量加上引号,改成 call :ss "%%i"
  2、把标签段:ss下的第一句:set var=%* 改成 "set var=%1"

前面用call :ss "%%i",后面set var=%1%1的值是带有引号的。用在这里会出错的,因为后面有%var%.rar。应该改用set var=%~1
在这里
  1. call :ss "%%i"
  2. set var=%~1
复制代码
  1. call :ss %%i
  2. set var=%*
复制代码
其实是一回事。只要后面的"%var%.rar"和"%var%"都要带上引号就可以了。

[ 本帖最后由 zljzsmzzx 于 2009-7-5 20:11 编辑 ]
作者: namejm    时间: 2009-7-5 20:13

  在有可能出现空格或&的地方,一定要记得带引号,这是处理文件路径的时候需要特别注意的。

  如果像 call :ss %%i 这样,变量不带引号,如果%%i带空格,将会被解释为多个形参,虽然后面可以用 set var=%* 来正确接收,但是,如果变量带了&,将会被认为是并行的两条语句,从而导致错误。
  同样的道理,set var=%* 也应该带上引号,并且为了和上一句带了引号的call语句相呼应,此处应该改为 set "var=%~1"。

  另外,6楼提到的错误已经在5楼修正,特此鸣谢。
作者: csjssdhy    时间: 2009-7-6 10:26

呵呵,按照上面的修改,完美解决了,学习了。
话说对特殊字符总感到吃力。
作者: 329949402    时间: 2024-5-13 15:02

好贴,学习了




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