我正在尝试使用带有7zip的批处理脚本压缩文件夹
但if语句中的SET函数不起作用;(
文件夹结构:
2000/
01/
02/
03/
04/
05/
06/
07/
08/
09/
10/
11/
12/
2001/
01/
02/
03/
04/
05/
06/
07/
...
这是我的代码:
@ECHO OFF
setlocal
echo %date%
set logMonth=%date:~4,2%
set logDay=%date:~7,2%
set logYear=%date:~10,4%
set path="C:\Program Files\7-Zip\";%path%
if %logMonth% EQU 01 (
set logMonth=12
set /a logYear=%logYear%-1
7z a -tzip c:\%logYear%%logMonth%.zip C:\files\v2-output\%logYear%\%logMonth%
) ELSE (
rem 1 saraas busad sar bol tuhain onii umnuh sariin folderiig ziplene
set /a logMonth=%logMonth%-1
7z a -tzip c:\%logYear%%logMonth%.zip C:\files\v2-output\%logYear%\%logMonth%
)
endlocal
如果当前月份相当于上一个月的01压缩文件夹,则压缩当前年度的前一个月。帮帮我们!
答案 0 :(得分:2)
在块语句(a parenthesised series of statements)
中,解析ENTIRE块并执行 THEN 。在块执行之前,块中的任何%var%
将被该变量的值在块被分配的时间替换。
因此,IF (something) else (somethingelse)
将在遇到%variables%
时使用IF
的值执行。
要克服此问题的两种常见方法是:1)使用setlocal enabledelayedexpansion
并使用!var!
代替%var%
来访问var
或2的中间值以进行调用一个子程序,用于使用更改的值执行进一步处理。
请注意,set /a
执行的任何计算都假设任何以0
开头的字符串都是 OCTAL 常量,因此set /a var+=%month%
会产生月份错误= 08(8月)或09(9月),因为8
和9
无效 OCTAL 字符。
设置/ a会抑制前导零,因此set /a var=03
会将var
设置为3
,而不是03
。经典地,要使用带有前导零的DECIMAL值进行计算,您需要使用set /a value=1%value% - 1
,然后使用[或设置value
到] %value:~1%
所以 - 试试
if %logMonth% EQU 01 (
set /a logMonth=112
set /a logYear=%logYear%-1
) ELSE (
rem 1 saraas busad sar bol tuhain onii umnuh sariin folderiig ziplene
set /a logMonth=1%logMonth%-1
)
set logmonth=%logmonth:~1%
7z a -tzip c:\%logYear%%logMonth%.zip C:\files\v2-output\%logYear%\%logMonth%