Answers:
我不确定您可以使用图形用户界面执行建议的操作,但是您当然可以从命令行执行以下操作:
FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"
您需要首先将目录(cd
命令)更改为F:\Downloads
目录,或者将要执行批量压缩的目录更改为该目录。同样,很容易替换为* .exe或您想要过滤的任何扩展名以仅压缩那些文档。
秘密解码器响起:
%i
是一个变量,用于保存循环中每个步骤的文件名(*.*)
是选择标准,它很容易是* .exe或类似名称7z.exe
是7-Zip的命令行版本%~ni
-这会将%i变量扩展为仅文件名-无扩展名如果只想为给定目录添加文件夹,则命令会稍微复杂一些,因为默认情况下,FOR只适用于文件。我们需要向它提供一些其他信息:
FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"
之所以起作用,是因为有几处看起来像魔术的东西:
/F
告诉FOR迭代()中的扩展值usebackq
告诉FOR我将要传递命令并使用输出进行迭代delims=?
告诉FOR我想将令牌分开?
-文件名和目录中的非法字符。我只想要一个令牌。/B
的DIR
是裸格式 -只是名称/A:D
在DIR
是限制通过属性的效果,d是目录如果要将其封装在批处理文件中,则唯一需要做的更改是对%i变量进行两次转义:
FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
我喜欢Goyuix的答案。但是,如果您使用的是Windows 7(或已安装Power Shell),并且还使用命令行版本的7-zip 7za.exe,则可以运行以下命令:
dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
您也可以将“ dir”更改为“ dir * .exe”以仅选择可执行文件。
关于Power Shell的一件好事是,您正在使用对象而不是字符串。因此,如果您愿意,您可以变得非常具体。例如:
dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
这仅包括以下文件:
编辑 如果要压缩文件而不是7-zip文件,请改用InfoZip的zip.exe。
7z a -tzip archive.zip *.exe
您可以从http://www.ghisler.com/plugins.htm下载并安装Total Commander的7zip插件。 一旦您在屏幕快照的窗口右侧执行了此操作,就会选择7zip压缩。使用该选项,您可以完全满足您的要求。
我刚刚一直在解决这个问题,发现的问题之一是存档中文件夹名称的重复,即,压缩名为“ foo”的文件夹时,.\foo\fighters.txt
将生成一个包含而不是仅包含的存档fighters.txt
。
因此,答案是进入要处理的目录,并使存档出现在上一个(根)目录中,然后返回该目录以处理下一个文件夹。
让7ZIP忽略根目录中现有的ZIP和CMD文件也很重要,以防止它们最终出现在归档文件中,因此请使用-x!*.zip
and -x!*.cmd
排除参数。
该脚本还将维护递归文件夹结构。
@echo off
REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal
if exist *.zip goto zip_exist
for /d %%X in (*) do (
cls
cd /D %%X
"e:\Program Files\7-Zip\7z.exe" a -r -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
cd ..
)
goto end
:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.
:end
pause
上面的代码应复制到批处理文件中,例如“ compress_dirs.cmd”,并从包含您要压缩的文件夹的目录中以admin身份运行。
希望这可以帮助。