REM Exclude file types for archiving
REM set EXCLUDE_FILES_TYPES=-x!*.rar -x!*.zip -x!*.7z
set EXCLUDE_FILES_TYPES=-xr!*.zip
REM Delete files after archiving
set DELETE_AFTER_ARCHIVE=-sdel
REM Archive files only older then days
REM set ARCHIVE_FILE_OLDER_THEN=-to5d
set ARCHIVE_FILE_OLDER_THEN=-5
set EXTRA_PARAM=%EXCLUDE_FILES_TYPES% %DELETE_AFTER_ARCHIVE% %ARCHIVE_FILE_OLDER_THEN%
REM ------------------------------------------------------------------------------------
REM Path to WinRAR executable in Program Files
set path="C:\Program Files\7-Zip";%path%
REM $Env:Path = $Env:Path + ";C:\Program Files\7-Zip"
REM Set your WinRAR installation path for local testing
REM set path="C:\Program Files\7-Zip";%path%
REM Replace space in hour with zero if it's less than 10
SET hr=%time:~0,2%
IF %hr% lss 10 SET hr=0%hr:~1,1%
REM This sets the date like this: mm-dd-yr-hrminsecs1/100secs
Set TODAY=%date:~4,2%-%date:~7,2%-%date:~10,4%-%hr%%time:~3,2%%time:~6,2%%time:~9,2%
IF EXIST %EDI832_US_ARCHIVE_DIR% (
cd %EDI832_US_ARCHIVE_DIR%
7z a "%EDI832_US_FILE%_%TODAY%" %EXTRA_PARAM%
答案1
如何使用 7-Zip 存档超过 5 天的文件?
不幸的是,7-Zip 目前没有按年龄/日期过滤文件的选项(据我所知)。
然而,基于关联@DavidPostill 在评论中建议使用 Windows福尔菲斯实用程序,您可能能够使用类似以下内容的内容:
@REM Set the file list name used with 7-Zip
set FILE_LIST=file_list.txt
if exist %EDI832_US_ARCHIVE_DIR% (
cd %EDI832_US_ARCHIVE_DIR%
@REM 7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM%
@REM forfiles /s /m *.* /d -5 /c "cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!" > file_list.txt
forfiles /s /m *.* /d %ARCHIVE_FILE_OLDER_THEN% /c "cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!" > %FILE_LIST%
@REM 7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM% @file_list.txt
7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM% @%FILE_LIST%
@REM del file_list.txt
@REM del %FILE_LIST%
)
在这种情况下,上述示例应生成超过 5 天的forfiles
文件列表 ( ),并采用以下格式为每个文件提供完整路径:> file_list.txt
"filename.ext"
"subfolder\filename.ext"
然后可以将其传递给 7zip 作为例子@file_list.txt
。
forfiles 示例命令
分解示例forfiles 命令选项:
/s
表示递归子目录。/m
是文件掩码(在此示例中,这包括通过 的所有文件和扩展名*.*
)。/d
设置要包含/排除的文件的年龄(基于文件的最后修改日期)。上面的示例将包括超过 5 天的文件(-5
)。当前日期包含在计算中,因此最多可计算 4 天前的文件不是考虑(即不会添加到此列表中)。/c
指定对每个文件运行的命令。该命令:cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!
工作原理如下:
cmd /v /c
运行一个新实例命令(Windows 命令提示符)延迟扩张启用( )并在完成命令后立即/v
关闭该实例( )。cmd
/c
set newpath=@RELPATH
创建一个名为的临时变量newpath
并将其设置为值@RELPATH
。是通过以下形式@RELPATH
自动创建的文件的相对路径,例如“\filename.ext”(其中表示当前文件夹)。forfiles
.\
echo !newpath:.\=!
打印 的修改版本newpath
。:.\=!
附加的部分newpath
实际上是 DOS 字符串变量操作,表示用.\
空值替换 的所有实例(=
)。当启用延迟扩展时,!
符号用于代替 来引用变量(例如而不是)。%
!newpath!
%newpath%
&&
只是允许将上面的两个单独的set
命令echo
放置/执行在一行上。
笔记
newpath
可以任意称呼。即使使用文件列表, 7-Zip 也应该尊重 7-Zip
-x
及其选项。-sdel
在一行中设置/使用变量的命令改编自对这个超级用户问题。
注意事项
.\
需要从传递给 7-Zip 的相对路径中删除,以保持相对目录结构。否则,保留.\
会导致 7-Zip 将所有压缩文件放在存档的根目录中(即没有子文件夹),从而“扁平化”所有内容。当从 生成的列表中读取时
forfiles
,某些字符差异可能会导致 7-Zip 跳过文件。例如,在文件名中使用’
而不是'
可能会导致“文件未找到”警告(因此这些文件不会添加到给定的存档中)。使用
cmd /c
withforfiles
会增加处理每个文件的开销(与不直接运行命令相比cmd
),但是绕过命令可能失败的任何潜在错误。/c "cmd /c [...]"
必须使用双引号,以免forfiles
出现使用两次的抱怨/c
。这上面有超级用户问题链接注意到使用
cmd /c /v
(而不是cmd /v /c
)可能会不是工作。给出的命令
forfiles
已在 Windows 7 上测试过。但是,在已经链接的同一个超级用户问题中,一条评论报告了在 Windows 10(版本 1607)上组合类似命令时出现的问题,显然是由于尾随空格造成的。在上下文中,上面提到的“尾随空格”问题似乎不太可能与此相关,但如果是这样,您可以尝试使用“内部引号”(如链接问题中所建议的)或直接使用
"cmd /c echo @RELPATH"
并forfiles
使用另一个命令行实用程序清除.\
(以及任何其他不需要的字符)的每一行file_list.txt
。您可以使用将文件单独添加到存档中
forfiles
(绕过例如的需要file_list.txt
),但这是一个很多速度较慢(相对而言),因为通常需要为添加的每个文件反复解压缩/重新压缩档案。
答案2
/d %存档文件_OLDER_THEN%
/d -%存档文件_OLDER_THEN%