Board logo

标题: [文件操作] 批量解压压缩文件用的批处理 该怎样补全比较稳健? [打印本页]

作者: wqte45    时间: 2024-9-22 21:08     标题: 批量解压压缩文件用的批处理 该怎样补全比较稳健?

  1. @echo off
  2. if "%~1" == "-m" (
  3.     set cmdline="%~2" -o"%~dpn2"
  4. ) else (
  5.     set cmdline="%~1" -o"%~dp1"
  6. )
  7. for /f "delims=" %%p in (C:\Windows\System32\pass.txt) do (
  8.     echo.
  9.     echo Trying password: %%p
  10.     7z x %cmdline% -p%%p -y >nul 2>nul
  11.     if errorlevel 2 (  
  12.         echo Password failed.  
  13.     ) else (  
  14.         echo Password succeeded!  
  15.         goto :end  
  16.     )  
  17. )  
  18. echo. & echo All passwords have been tried, no correct password found.
  19. :end
  20. exit /b
复制代码
对批处理不熟悉,只会用一些简单的命令,写这个代码很费劲,大家看看代码怎么样能改进? 代码越少越好,我也比知道上面的代码有啥隐患没有。
不过我发现 for /f "delims=" %%p in (C:\Windows\System32\pass.txt) do  这里的文件路径,我如果用%~dp0pass.txt  发现一个问题:就是如果是在cmd里面 手动输入 命令  ***.bat  d:\1.rar  就能正常,但是如果我直接打开1.rar的目录 点击右键 选择解压
(解压已经添加到注册表里 ***.bat “%1” )就发现失败,原因是%~dp0pass.txt  并没有解析为 ***.bat文件自身所在的目录,而是解析成了1.rar的目录 成了d:\pass.txt...真搞不懂  我只能写成绝对路径C:\Windows\System32\pass.txt(批处理也在这个目录里)
才会解析成功,文件右键还是命令行都可以,但是为啥改成%~dp0pass.txt 就容易解析错呢。我的批处理基础太差了,  刚开始写set 那个等号 左右两边居然不能用空格,只能用记事本写,也没有语法检查的功能,每次都出错,检查错误的方式只能去掉echo off  看看代码执行情况。。我觉得你们精通批处理的都很厉害呢

这个批处理 就是批量解压压缩文件用的,因为客户的压缩包,都有不同的密码,密码都十几个,而且我也不知道那个压缩包对应哪个密码,所以就想批量尝试密码文件,效果挺好的,就是代码写的太差了,大家帮我纠正下错误吧 感谢!
作者: 77七    时间: 2024-9-23 14:51

试着写了一个
  1. @echo off
  2. echo 解压 "%~1"
  3. choice /t 5 /d y /m "解压到【当前文件夹】 [Y,默认]   或   解压到【%~n1】 [N]"
  4. if errorlevel 2 (
  5. set str=-o"%~dpn1"
  6. )
  7. for /f "delims=" %%a in ('more +12 "%~f0"') do (
  8. 7z x "%~1" %str% -p%%a&&exit
  9. )
  10. echo 解压失败
  11. pause
  12. exit
  13. 123
  14. 456
复制代码


d:\1\2.bat

  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\SystemFileAssociations\.7z\Shell\7z1]
  3. @="自定义解压"
  4. [HKEY_CLASSES_ROOT\SystemFileAssociations\.7z\Shell\7z1\Command]
  5. @="\"D:\\1\\2.bat\" \"%1\""
复制代码


1.reg

屏蔽7z 的错误输出,再判断errorlevel好像有点多此一举...
作者: aloha20200628    时间: 2024-9-23 16:38

本帖最后由 aloha20200628 于 2024-9-23 16:45 编辑

回复 1# wqte45

以下代码仅供参考...
代码简要说明》
假设第一个命令行参数指定压缩包文件,未发现命令行参数则自动退出;
解压文件在压缩包文件所在目录下的一个新建子目录中,其名与压缩包文件同名。
  1. @echo off &if "%~1"=="" exit/b
  2. for /f "delims=" %%p in (C:\Windows\System32\pass.txt) do (
  3.     echo,trying to unpack with password: %%p
  4.     7z x "%~1" -o"%~dpn1" -p"%%p" -y>nul 2>nul
  5.     if errorlevel 2 (echo,unpack faild) else (echo,unpack done! &goto :end)
  6. )
  7. echo,no valid password found
  8. :end
  9. pause&exit/b
复制代码





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