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


10

因此,我尝试在批处理文件中使用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存档共享文件名,当然要减去扩展名。

任何帮助是极大的赞赏。


另外,如果有使用Windows 10上的内置zip功能的简便方法,也可以。
Mike Van Dunk

Answers:


4

我希望每个文件都有自己的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"

更多资源


4

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

@echo on

告诉命令提示符在执行命令之前先打印批处理文件中的每个命令。这样做是为了让您可以在执行之前“查看”它的实际功能。

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

ç hanges ð irectory成什么样,我希望是你要压缩的所有文件的路径。

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

IN此处的参数是(C:\Users\MVD21\Desktop\test)。这将导致循环“ body”(关键字后面的动作DO)仅执行一次,并为%i参数分配了value C:\Users\MVD21\Desktop\test。这样做并不符合您的要求也就不足为奇了!看起来这会将整个目录压缩为单个.7z文件。

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

pause

脚本完成后,此关键字仅告诉外壳程序等待您按Enter或关闭命令提示符,而不是立即退出。


在构建批处理脚本(或者实际上是任何其他与代码有关的代码)时,您应该停止将整个脚本视为您不(试图)理解的整体复制粘贴,而分解您的将问题分解为多个子部分,您可以分别找出它们,然后将它们连接在一起。这将使您能够独立解决问题并创建解决方案,而不必要求别人为您完成所有工作。我强烈推荐它。

就您而言,您有以下问题的子组件:

  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 onand pause语句是一种好习惯,因此您可以将其保留cd。如果文件位于该路径中,则可能也希望保留该语句。

那给我们留下了什么呢?

@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安装位于何处(文件路径)?
  • PATH环境变量的内容中是否包含7-zip安装的文件位置?(如上所述,请echo %PATH%cmd提示下进行检查。)

我认为这不起作用,因为我在另一个驱动器上安装了7zip?如果我像原始答案中那样执行“ 7zip的位置”,这似乎可行。当然,这只是“有时”工作。它一直有效,直到我在其下放了另一个echo语句,而现在为止没有了。是的,我试图了解有关批处理文件的更多信息。我一直在尝试查找批处理命令的词汇表或不该学习的词汇表,因此我真正理解了它。相信我,我宁愿理解并拥有它,而不是仅仅拥有它。
Mike Van Dunk

我尝试了您的解决方案,但由于批处理文件根本没有运行,所以无法告诉您输出是什么。它会短暂打开,而cmd窗口只会闪烁,然后再次关闭。是的,我在那里停了下来。我在本地驱动器和辅助内部驱动器上都安装了7zip,但它似乎不是路径环境的一部分
Mike Van Dunk

我真的很想了解,但是搜索Google并没有太大帮助。例如,我不知道“'dir / b”命令或参数是什么或它在做什么。我知道dir显然是一个目录,但是我不知道/ b是什么。我想让别人解释参数的作用,以便我更好地理解。或者,如果某人具有指向该站点的链接,那么他们也可以进行此类操作。我在一个批处理文件中用“ dir / b”进行了搜索,但找不到任何东西。我认为 / b与文件名有关,但是我不确定。
Mike Van Dunk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.