使用批处理文件进行压缩

3

我需要用批处理制定一个解压文件的条件。

方法如下: 如果dummy=1,批处理将解压一个xlsx文件到特定文件夹,否则,它将直接复制另一个xlsx文件到该文件夹。

我的代码如下:

set dummy=1

If %dummy% EQU 1 (
SET CHEMIN=C:\file_to_unzip
cd %CHEMIN%
for /f %%j in ('dir /b %CHEMIN%\*.zip') do (
C:\PROGRA~1\WinZip\Winzip32 -min -e -o -j %CHEMIN%\%%j %CHEMIN%
) 
COPY "C:\file_to_unzip\*.xlsx" "C:\destination" 
) else (
COPY "C:\file_to_copy\*.xlsx" "C:\destination"
)

问题在于没有 IF 条件时,unzip 命令可以正常工作。但是一旦包含 IF 条件,则 cmd 会说找不到 zip 文件。我不确定是什么原因导致了这个问题,以及如何解决它。
感激任何帮助。

在此脚本末尾添加一个“暂停”语句,或者从cmd.exe运行此脚本,删除开头的@echo off。这将帮助您检查是否有任何中间命令失败,以及命令是否按照您的预期获取参数。同时,在cd命令之后加上pwddir /b %CHEMIN%\*.zip,纯粹是为了调试目的。 - anishsane
谢谢。我尝试了echo off,但输出很混乱。不过,我能从cmd中获得错误消息。然而,有时批处理会完全退出cmd而不留下任何消息(我猜这是因为语法错误?),这使得调试变得困难。 - Matthew
“我猜这是语法错误的原因”:这就是为什么我要求您从cmd.exe运行,而不是双击的原因。 - anishsane
1个回答

1
你是否启用了延迟扩展?setlocal enabledelayedexpansion 根据上面的示例代码,如果CHEMIN变量在if语句内设置,则会导致失败。如果在括号范围内设置变量,则该变量的新值将在所有子范围结束之前不可用。运行以下脚本以查看我的意思:
@echo off
set "xValue=1"
echo.%xValue%
if 1 EQU 1 (
    set "xValue=2"
    echo.%xValue%
    echo.!xValue!
)

如果禁用了延迟扩展(默认情况下是禁用的),则结果将会是:

1
1
1

如果启用,将在开头添加setlocal enabledelayedexpansion

1
1
2

请按照以下步骤尝试您的脚本。使用方法:

setlocal enabledelayedexpansion

set dummy=1

If %dummy% EQU 1 (
    SET CHEMIN=C:\file_to_unzip
    cd !CHEMIN!
    for /f %%j in ('dir /b !CHEMIN!\*.zip') do (
        C:\PROGRA~1\WinZip\Winzip32 -min -e -o -j !CHEMIN!\%%j !CHEMIN!
    )
    COPY "C:\file_to_unzip\*.xlsx" "C:\destination" 
) else (
    COPY "C:\file_to_copy\*.xlsx" "C:\destination"
)

另一个解决方案是将set CHEMIN=C:\file_to_unzip行移动到if语句之外。

谢谢。在我添加了delayedexpansion和!CHEMIN!之后,它可以工作了。所以我的猜测是,在delayedexpansion下,!CHEMIN!将强制立即评估CHEMIN表达式? - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接