Board logo

标题: [文件操作] [已解决]请求用批处理将目录内同名文件用RAR打包为自解压文件 [打印本页]

作者: semiuel    时间: 2009-5-14 20:35     标题: [已解决]请求用批处理将目录内同名文件用RAR打包为自解压文件

要求,如下:
把目录中的所有同名文件(即同文件名,后缀名不同),打包成同名的WINRAR自解压文件。
  如:目录内有文件 1.txt、1.pdf、1.doc、1.xls、2.pdf、2.txt、2.log,那么要求打包成1.exe,2.exe。
1.exe和2.exe都是WINRAR自解压文件。

WINRAR安装在默认目录.

请高手帮忙.


参照4楼方法做了一个小小的修改.
  1. @echo off
  2. set SrcFolder=D:\test
  3. set rarPath=C:\Program Files\WinRAR
  4. for %%a in ("%SrcFolder%\*.*") do (
  5.   md "%SrcFolder%\%%~na" 2>nul
  6.   move /y "%%a" "%SrcFolder%\%%~na" 2>nul
  7. )
  8. for /f "delims=" %%a in ('dir /ad /b "%SrcFolder%\"') do (
  9.   "%rarPath%\rar.exe" a -sfx -ep "%SrcFolder%\%%~na.exe" "%SrcFolder%\%%a"
  10. )
复制代码
RAR.EXE加了一个"-EP"参数,不记录路径信息,这样打包后的EXE文件没有路径信息.
另外,本批处理程序不能跟需要处理的文件放在同一目录.

新解决方案见8楼.
不需要把文件移动到相应子目录就可以直接压缩.

[ 本帖最后由 semiuel 于 2009-5-16 00:16 编辑 ]
作者: namejm    时间: 2009-5-14 20:57

  这个问题的难点在于如何获取同名文件,所以,需要楼主确认一下以下信息:
  1、这些文件名是不是固定的?如果是固定的话就很好办;
  2、这些文件的后缀名是不是固定的?如果是固定的也好办;
  
  如果文件名和后缀名都不固定,或者都是未知的,那么,处理起来将会有一点难度。
作者: semiuel    时间: 2009-5-14 21:08

我是帮别人问的,我去了解下情况.
回来再麻烦大家.
作者: Batcher    时间: 2009-5-14 21:33

  1. @echo off
  2. set SrcFolder=D:\test
  3. set rarPath=C:\Program Files\WinRAR
  4. for %%a in ("%SrcFolder%\*.*") do (
  5.   md "%SrcFolder%\%%~na" 2>nul
  6.   move /y "%%a" "%SrcFolder%\%%~na" 2>nul
  7. )
  8. for /f "delims=" %%a in ('dir /ad /b "%SrcFolder%\"') do (
  9.   "%rarPath%\rar.exe" a -sfx "%%~na.exe" "%SrcFolder%\%%a"
  10. )
复制代码

作者: semiuel    时间: 2009-5-14 22:47

谢谢楼上两位,问题解决了,请锁帖.
作者: namejm    时间: 2009-5-14 23:34

  随着认识的不断深入,有些当时已经解决的问题,可能还存在更完美的解决方案,还有继续讨论的价值,论坛一向不提倡对技术讨论帖子进行锁定,除非是已经出现了违规行为。
作者: semiuel    时间: 2009-5-15 09:06

呵呵,不好意思啊~是我考虑不周.
也习惯了其它论坛的问题解决就锁帖的行为.
今天早上试了一下,确实有个小问题.
就是当文件没有扩展名的时候,批处理不会压缩这个文件.
作者: semiuel    时间: 2009-5-16 00:11

我在赢政天下论坛发现新解,效果比4楼的好.
  1. @echo off
  2. path %path%;"C:\Program Files\WinRAR"
  3. cd /d "D:\test" ||pause&&exit/b
  4. echo 打包中,请稍等...
  5. for /f "delims=" %%a in ('dir/b/a-d') do (
  6.   if not exist "%%~na.exe" (
  7.     dir /b "%%~na.??????????"|rar a -idq -sfx "%%~na" -n@
  8.   )
  9. )
  10. echo 完成。请按任意键退出...
  11. pause>nul
复制代码

作者: Batcher    时间: 2009-5-16 08:19     标题: 回复 8楼 的帖子

请用此代码分别测试如下场景,看看是不是你想要的结果。

1、文件列表:
a.txt
a.exe

2、文件列表:
a.BatHome
a.BatHomeBacher
作者: Batcher    时间: 2009-5-16 09:11     标题: 回复 7楼 的帖子

1、本批处理程序可以跟需要处理的文件放在同一目录
2、可以兼容没有扩展名的文件
  1. @echo off
  2. set SrcFolder=D:\test
  3. set rarPath=C:\Program Files\WinRAR
  4. rd /s /q "%temp%\BatHome"
  5. md "%temp%\BatHome"
  6. for %%a in ("%SrcFolder%\*.*") do (
  7.   if "%%~xa" equ "" (
  8.     move "%%a" "%temp%\BatHome"
  9.   )
  10. )
  11. for %%a in ("%SrcFolder%\*.*") do (
  12.   if "%%~nxa" neq "%~nx0" (
  13.     md "%SrcFolder%\%%~na"
  14.     move /y "%%a" "%SrcFolder%\%%~na"
  15.   )
  16. )
  17. for /f "delims=" %%a in ('dir /ad /b "%SrcFolder%\"') do (
  18.   "%rarPath%\rar.exe" a -sfx -ep "%SrcFolder%\%%~na.exe" "%SrcFolder%\%%a"
  19. )
  20. for %%a in ("%temp%\BatHome\*.*") do (
  21.   "%rarPath%\rar.exe" a -ep "%SrcFolder%\%%~na.exe" "%%a"
  22. )
复制代码

作者: semiuel    时间: 2009-5-16 10:02

原帖由 Batcher 于 2009-5-16 08:19 发表
请用此代码分别测试如下场景,看看是不是你想要的结果。

1、文件列表:
a.txt
a.exe

2、文件列表:
a.BatHome
a.BatHomeBacher


因为在他的使用过程中不会出现EXE文件和扩展名超过10字符

10楼的程序我试了一下,有一个问题.
当出现不带扩展名的文件时,自解压压缩包里会有这个文件,但文件被移动到子目录时,那个文件不见了.

[ 本帖最后由 semiuel 于 2009-5-16 10:08 编辑 ]
作者: tireless    时间: 2009-5-16 10:08

改成这样,避免批处理自身被打包:
@echo off
path %path%;"C:\Program Files\WinRAR"
cd /d "D:\test" ||pause&&exit/b

echo 打包中,请稍等...
for /f "delims=" %%a in ('dir/b/a-d') do (
  if not exist "%%~na.exe" (
    dir /b "%%~na.??????????"|rar a -idq -sfx "%%~na" -n@ -x"%~f0"
  )
)
echo 完成。请按任意键退出...
pause>nul

不会漏掉没有扩展名的文件,dir test.???????? 会列出所有文件名为 test 的文件,包括没有扩展名的。

[ 本帖最后由 tireless 于 2009-5-16 10:17 编辑 ]
作者: semiuel    时间: 2009-5-16 10:18

楼上是从赢政过来的吧?我看到你在那个帖子的回复了.
如果需要处理的文件里带EXE文件和扩展名超过10个字符的文件,怎么办?

[attach]1335[/attach]

[ 本帖最后由 semiuel 于 2009-5-16 10:22 编辑 ]
作者: tireless    时间: 2009-5-16 10:29     标题: 回复 13楼 的帖子

那就再加 10 个问号...

你的要求是打包成同名的 exe,如果有 test.exe,打包后要如何改名?
作者: Batcher    时间: 2009-5-16 12:21     标题: 回复 14楼 的帖子

不能打包exe文件,这一点正是8楼的方法的缺陷所在。
作者: Batcher    时间: 2009-5-16 12:24     标题: 回复 11楼 的帖子

当出现不带扩展名的文件时,自解压压缩包里会有这个文件,但文件被移动到子目录时,那个文件不见了.

没看懂啥意思,“文件被移动到子目录”是什么意思?你说的我的代码在移动文件的时候吗?
我那个代码会把没有扩展名的文件先移动到一个系统临时目录里面。
作者: tireless    时间: 2009-5-16 21:32

  1. @echo off
  2. path %path%;"e:\Program Files\WinRAR"
  3. cd /d "D:\test"
  4. md 自解压文件
  5. for %%a in (*) do (
  6.   if not exist 自解压文件\%%~na.exe (
  7.     dir/a-d/b "%%~na.??????????"|rar a -idq -sfx "自解压文件\%%~na" -n@ -x"%~f0"
  8.   )
  9. )
复制代码

[ 本帖最后由 tireless 于 2009-5-18 23:10 编辑 ]




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