标题: [文本处理] [已解决]批处理中批量压缩文件夹时无法识别长文件名? [打印本页]
作者: csjssdhy 时间: 2009-7-4 10:33 标题: [已解决]批处理中批量压缩文件夹时无法识别长文件名?
批量压缩文件- @echo off
- title 忆林子--批量压缩rar文件
- color 0a
- rem *********************************************************
- rem 在注册表中读取winrar的安装目录
- rem 如果已经存在临时文件,把它删除
- if EXIST tmp.忆林子 del tmp.忆林子
- rem 查询注册表中的winrar的路径值,并把它发送到临时文件中
- reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe" /v path>>tmp.忆林子
- rem 用For命令从临时文件中读取winrar的路径值,并把它保存到变量 WinRAR 中
- for /f "tokens=1,2,* skip=4 delims= " %%j in ('more tmp.忆林子') do set WinRAR=%%l
- rem 如果已经存在临时文件,把它删除
- if EXIST tmp.忆林子 del tmp.忆林子
- rem *********************************************************
- rem 用dir命令列出当前目录下的所有目录
- rem 并把它发送到for循环中,然后在for循环中调用压缩的子过程
- for /f "delims=" %%i in ('dir /ad /b') do call :ss %%i
- cls
- echo ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- echo.
- echo 操作成功结束,请按任意键退出该批处理...
- echo.
- echo ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- PAUSE>nul
- exit
- :ss
- set var=%*
- rem 即 rar a -r 压缩后的文件名.rar 目录名
- "%WinRAR%\rar" a -r %var%.rar %var%
- EndLocal
复制代码
我从网上找到这个代码,bat 可以批量压缩每个文件夹到每个单独的压缩文件,问题是压缩时许多长文件名的文件夹无法识别,漏压很多文件夹,如何解决呢
[ 本帖最后由 csjssdhy 于 2009-7-6 10:27 编辑 ]
作者: zljzsmzzx 时间: 2009-7-4 11:15
把- "%WinRAR%\rar" a -r %var%.rar %var%
复制代码
改成- "%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。
在这里- call :ss "%%i"
- set var=%~1
复制代码
跟复制代码
其实是一回事。只要后面的"%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://www.bathome.net/) |
Powered by Discuz! 7.2 |