使用批处理文件将文件压缩为单独的 zip 文件

使用批处理文件将文件压缩为单独的 zip 文件

因此,我尝试在批处理文件中使用 7zip 将文件夹中的文件压缩为单个文件。因此,第一个文件会获得自己的 zip 存档,下一个文件也是如此。我在网上搜索并尝试了许多不同的代码。到目前为止,我只成功地将它们压缩为单个 zip 文件并将其输出到我的桌面。

不幸的是,我丢失了执行该操作的代码,现在我被困住了,它似乎什么也没做。

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

我希望每个文件都有自己的 zip 存档,并且 zip 存档共享文件的名称,当然不带扩展名。

任何帮助是极大的赞赏。

答案1

我希望每个文件都有自己的 zip 存档,并且 zip 存档共享文件的名称,当然不带扩展名。

批处理脚本

(在顶部设置源和目标完整的显式文件夹路径,然后根据需要运行。源是您要压缩的文件所在的位置,而目标是您想要将这些文件压缩到的位置。)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.zip" "%SourceDir%\%%~NXF"
)
EXIT

命令行

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

更多资源

答案2

您的原始脚本逐行执行以下操作:

@echo on

告诉命令提示符在执行批处理文件中的每个命令之前将其打印出来。这样您就可以在执行命令之前“看到”它实际上在做什么。

cd "C:\Users\MVD21\Desktop\test"

C亨吉斯目录到我希望的您想要压缩所有文件的路径。

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

这里的参数IN(C:\Users\MVD21\Desktop\test)。这将导致循环“主体”(关键字 后面的操作DO)得到执行。恰好一次,并将%i参数赋值为C:\Users\MVD21\Desktop\test。毫无疑问,这不会达到你想要的效果!看起来这会将整个目录压缩成一个 .7z 文件。

如果确实如此没有什么,可能是因为找不到 的路径7z.exe。如果该文件不在当前目录(test上面提到的目录)中,那么它必须位于PATH(在%PATH%环境变量中;echo %PATH%在 shell 中尝试查看它当前设置为何值)。否则,您必须复制7z.exe到当前目录或指定其所在位置的绝对路径(例如"C:\Program Files\7-zip\7z.exe" ...)。

pause

当脚本完成时,这个关键字只是告诉 shell 等待你按下回车键或关闭命令提示符而不是立即退出。


当你编写批处理脚本(或者任何其他处理代码的脚本)时,你不应该将整个脚本视为你无法(试图)理解的单一复制粘贴,而是将问题分解为可以单独解决的子部分,然后将它们连接在一起。这将使你能够独立解决问题,创造解决方案,而不是要求别人为你完成所有工作。我强烈推荐它。

就您而言,您的问题包含以下几个子组成部分:

  1. 迭代(循环遍历)给定目录内包含的每个文件。
  2. 对于每个给定的文件,通过调用该实用程序将其放入 .7z 文件中7z

某人已经有一个可以解决你特定需求的答案的可能性,要小于能够单独找到更一般问题的可能性。

这个问题,“如何在批处理脚本中对目录中的每个文件执行某些操作”解决了你一半的问题。

答案的要点是,您只需从 StackOverflow 答案中的这部分开始:

for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f

并改变它的部分做某事(该echo %%f)做什么你想做我知道你需要改变那部分,因为我已经分析了文本脚本并理解每个字符和参数的含义,这样我就可以推断出我想在哪里插入自己的代码。

这是一些“空中代码”(未经测试!):

for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"

上面的和语句是很好的做法,因此您可以将它们保留。如果您的文件位于该路径中,您可能也希望保留该语句@echo onpausecd

那么这给我们留下了什么呢?

@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause

如果您回复“这不起作用!”,我将不会帮助您。如果你尝试这个但没有效果,你必须在评论中告诉我以下信息:

  • 什么精确的当您运行这些命令或将它们放入批处理文件中并运行它们时,命令提示符中会出现什么错误消息?不要缩写;直接复制并粘贴输出(将其放在http://pastebin.com如果很多的话)
  • 你是什​​么思考错误信息告诉你问题出在哪里?
  • 您的 7-zip 安装位于哪里(文件路径)?
  • 7-zip 安装的文件位置是否包含在环境变量的内容中PATH?(如上所述,在提示符echo %PATH%下检查这一点cmd。)

答案3

如果您将其保存为 bat 文件,它将在 SourceDir 中找到所有文件 *.txt,然后将它们压缩到 DestDir,然后从 sourcedir 中删除它们

@ECHO 开启

设置源目录 = C:\Logs 设置目标目录 = C:\LogsZipped

光盘 C:\LogsZipped

FOR /f %%i IN ('dir /b %SourceDir% \ *.txt') DO "C:\Program Files\7-Zip\7z.exe" a "%%~ni.zip" "%SourceDir% \ %%i" && DEL /Q /F "%SourceDir% \ %%i"

出口

相关内容