如何使用批处理文件循环遍历几个可执行文件以压缩它们(.7z)并重命名该文件以避免“ .exe.7z”

时间:2018-07-18 03:40:18

标签: batch-file cmd zip 7zip

我正尝试使用批处理文件一次性压缩27个exe文件。该文件的目的是为修改后的HBCD菜单创建.7z文件。该文件位于... \ Documents \ CD \ HBCD \ Programs exe文件位于... \ Documents \ CD \ HBCD \ Programs \ Files \ SysinternalsSuite

我不断得到:

Error:
Incorrect command line

我一直在搜索并尝试不同的方法,但是我无法使其正常工作。

文件名:7zBatch.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
pushd "%~dp0"
echo "-------------------------------------------------"
echo "||======== BATCH ZIPPER (.7z) for HBCD ========||"
echo "-------------------------------------------------"

:AskSource
echo Enter the location of the exe file(s)
set SOURCE=
set /p SOURCE=">>" %=%
echo "%SOURCE%", is that correct & goto ConfirmSource

:ConfirmSource
echo (Y)es or (N)o?
set INPUT=
set /p INPUT=">>" %=%
if /I "%INPUT%"=="y" goto AskDest
if /I "%INPUT%"=="n" goto AskSource
echo Incorrect input, is the location correct? & goto ConfirmSource

:AskDest
cd %SOURCE%
echo Enter the location of the zip file(s)
set DEST=
set /p DEST=">>" %=%
echo "%DEST%", is that correct & goto ConfirmDest

:ConfirmDest
echo (Y)es or (N)o?
set INPUT=
set /p INPUT=">>" %=%
if /I "%INPUT%"=="y" goto Execute
if /I "%INPUT%"=="n" goto AskDest
echo Incorrect input, is the location correct? & goto ConfirmDest

:Execute
 FOR /f "tokens=*" %%G IN ('dir /b *.exe') DO (
 set fname=%%G
 set nfname=!fname:.exe=!
 echo.
 echo Found: !fname!

 ..\..\7z.exe a -t7z !nfname!.7z "!fname!" -mx5 -sdel -oC:%DEST%
 timeout /t 10 /nobreak
 )
ENDLOCAL
echo.
pause

一旦到达7 Zip行,它将给出错误。我意识到 nfname 变量为空,所以我尝试了:

set nfname=!%%G:.exe=!

那没有用,所以我尝试删除它并继续:

..\..\7z.exe a -t7z !fname:.exe=!.7z "!fname!" -mx5 -sdel -oC:%DEST%

那没有用,所以我尝试将不同的内容一一括在引号中,然后将所有内容括起来:

"..\..\7z.exe" a -t7z "!fname:.exe=!.7z" "!fname!" -mx5 -sdel -oC:"%DEST%"

什么都没有。我想念什么?

1 个答案:

答案 0 :(得分:0)

@echo off
SETLOCAL
echo "-------------------------------------------------"
echo "||======== BATCH ZIPPER (.7z) for HBCD ========||"
echo "-------------------------------------------------"

:AskSource
echo Enter the location of the exe file(s)
set "SOURCE="
set /p "SOURCE=>>"
echo "%SOURCE%", is that correct

:ConfirmSource
echo (Y)es or (N)o?
set "INPUT="
set /p "INPUT=>>"
if /I "%INPUT%"=="y" goto AskDest
if /I "%INPUT%"=="n" goto AskSource
echo Incorrect input, is the location correct?
goto ConfirmSource

:AskDest
echo Enter the location of the zip file(s)
set "DEST="
set /p "DEST=>>"
echo "%DEST%", is that correct

:ConfirmDest
echo (Y)es or (N)o?
set "INPUT="
set /p "INPUT=>>"
if /I "%INPUT%"=="y" goto Execute
if /I "%INPUT%"=="n" goto AskDest
echo Incorrect input, is the location correct?
goto ConfirmDest

:Execute
FOR %%G IN ("%SOURCE%\*.exe") DO (
    "%~dp0..\..\7z.exe" a -t7z "%DEST%\%%~nG.7z" "%%~fG" -mx5 -sdel
)
ENDLOCAL
echo.
pause

pushdcd已删除。不确定为什么7z.exe是 从输入可执行文件开始位于2个目录 目录位于。 7z.exe现在位于2个目录中 从脚本目录开始。

-o的{​​{1}}开关仅用于提取 在帮助文件中提到过,因此省略。

对变量7z.exe进行双引号,以避免出现尾随空格。

set循环更改为简单类型,因为它提供了文件 不需要使用for的路径。

dir被删除为EnableDelayedExpansion变量 使用修饰符获取全路径,名称,驱动器等。请参见 for关于可用的修饰符。

已删除for /?,因为它抱怨是否使用了stdin并查看 没有理由将其用于此任务。

删除了移至下一行的过时timeout命令 用命令。