Batch file 如何在所有子文件夹中单独压缩所有文件并在压缩后删除原始文件

Batch file 如何在所有子文件夹中单独压缩所有文件并在压缩后删除原始文件,batch-file,Batch File,我要找的是一个.bat文件代码,在当前文件夹中的所有子文件夹中单独压缩文件,然后删除文件,要排除已压缩/压缩的文件,我不希望文件夹被压缩,我希望压缩时文件保持名称不变 我有一堆文件夹/文件和我找到的唯一代码 @ECHO OFF FOR %%i IN (*.*) DO ( ECHO "%%i" | FIND /I "batch zip files.bat" 1>NUL) || ( "c:\Program Files\7-Zip\7z.exe&

我要找的是一个.bat文件代码,在当前文件夹中的所有子文件夹中单独压缩文件,然后删除文件,要排除已压缩/压缩的文件,我不希望文件夹被压缩,我希望压缩时文件保持名称不变

我有一堆文件夹/文件和我找到的唯一代码

@ECHO OFF
FOR %%i IN (*.*) DO (
ECHO "%%i" | FIND /I "batch zip files.bat" 1>NUL) || (
"c:\Program Files\7-Zip\7z.exe" a -tzip "%%~ni.zip" "%%i"
if %ERRORLEVEL% == 0 del "%%i"
)
)
压缩当前目录中的所有文件,不接触子文件夹


如果有人能帮我做这件事,我将不胜感激,因为我可以通过压缩所有文件来节省大量空间。您提供的代码的第一个问题是,您的
for
循环只解析当前目录中的文件,没有递归到子目录中。要解析子目录中的文件,我建议您使用
For/F
循环,使用
Dir
命令的
/B
/S
选项。我还建议您包括属性选项,
/A
,它将包括每个项目,然后省略您不感兴趣的项目。例如,您不太可能希望压缩目录、隐藏文件、重新分析点或系统文件。您可以通过排除这些属性来做到这一点,
/A:-D-H-L-S
。要了解有关
For
命令和
Dir
命令的详细信息,请打开命令提示窗口,键入
For/?
,然后按ENTER键。然后可以对
Dir
命令执行相同的操作,即
for/?
。由于在脚本开始时没有定义工作目录,因此在运行脚本时,它将针对任何当前文件和目录运行。因为代码中有一行不包括名为
batch zip files.bat的文件,所以我假设这是正在运行的脚本的名称,因此您的目的是针对树中与批处理文件本身位于同一位置的所有文件运行脚本。为了确保始终如此,为了安全起见,我从一开始就使用
CD
命令,
CD/D“%~dp0”
将该目录定义为当前目录<代码>%0
是对自身的特殊批处理文件参数引用,若要了解更多信息,请查看来自两个
调用/?
的输出。您还可以在命令提示窗口中了解输入
CD/?
CD
命令。为了省略批处理文件,因为您不希望压缩和删除它,我通过
FindStr
Dir
命令的结果传输到
FindStr
,只打印与不区分大小写的文本字符串
%~f0
不完全匹配的项目(扩展到批处理文件本身的完整路径)。此外,我还通过另一个
findstr.exe
命令将这些结果传输到管道中,以忽略任何已经带有
.zip
扩展名的文件,因为压缩已经压缩文件的文件没有意义。(但是请注意,要获得更健壮的代码,您应该真正检查这些是zip存档,而不仅仅是带有误导性扩展名的文件)。然后将这些命令的结果逐一传递到
Do
部分,其中包括
7z.exe
命令。在这个阶段,我假设您的意图是将压缩的归档文件保存到与原始文件相同的位置。为此,我在
%%G
上使用了变量展开来规定其目录、路径和名称,
%%~dpnG
,(请参阅
下的用法信息以获取/?
以重述)。成功完成归档过程后,原始文件将被删除,为此,我在原始命令字符串中添加了
-sdel
选项。请注意,如果您希望更新现有的zip文件等,您可能需要包括其他选项(在命令提示窗口中使用
%ProgramFiles%\7-zip\7z.exe“-?
查看它们)。正如我之前没有提到的,在脚本开始时,我确保启用了扩展。虽然这是默认选项,但更安全的是,如果变量扩展和
CD
For
命令不受影响,则会受到影响

下面是上面解释的代码:

@Echo关闭
setLocalEnableExtensions
CD/D“%~dp0”
对于/F“EOL=?Delims=“%%G In('Dir“*”)/A:-D-H-L-S/B/S 2^>NUL^|
%SystemRoot%\System32\findstr.exe/I/L/V/X“%~f0”^|
%SystemRoot%\System32\findstr.exe/E/I/L/V“.zip”
)执行“%ProgramFiles%\7-Zip\7z.exe”a-tzip“%%~dpnG.Zip”“%%G”-sdel

查看您的问题(与最初的问题有所不同),您似乎不再对批处理文件目录中的文件感兴趣,“单独压缩当前文件夹中所有子文件夹中的文件”。出于这个原因,我提供了以下替代方法,即方法论

不同之处在于,我首先使用
For
循环,仅包括当前工作位置中的目录,
/a:D-H-L-S
,然后运行与前一个示例中使用的相同方法,但有一个区别。由于我们现在不再压缩当前工作目录中的文件,我们可以删除
findstr.exe
命令,过滤掉正在运行的批处理文件:

@Echo关闭
setLocalEnableExtensions
CD/D“%~dp0”
对于/F“EOL=?Delims=“%%G In('Dir“*”)/A:D-H-L-S/B 2^>NUL”
)对于/F“EOL=?Delims=“%%H In('Dir“%%G”/A:-D-H-L-S/B/S 2^>NUL^|
%SystemRoot%\System32\findstr.exe/E/I/L/V“.zip”
)执行“%ProgramFiles%\7-Zip\7z.exe”a-tzip“%%~dpnH.Zip”“%%H”-sdel

请注意,我上面的回答基本上是为了纠正您的代码尝试,而不是对速度的个人建议,也不是为了执行问题中列出的任务。此外,我不知道如果这些文件中的任何一个正在使用/被锁定,会发生什么,也没有尝试检查这些文件