如何在不知道文件夹全名的情况下通过命令行将文件夹压缩为存档文件?

Posted

技术标签:

【中文标题】如何在不知道文件夹全名的情况下通过命令行将文件夹压缩为存档文件?【英文标题】:How to compress folder into an archive file by command line without knowing the full name of the folder? 【发布时间】:2021-08-10 02:30:54 【问题描述】:

我每个月都必须压缩一些文件夹,这些文件夹总是以引用月份的编号开头,后跟-

例如:

四月:文件夹是04- ?????? May:文件夹为05- ???????

我只知道文件夹名称的第一部分。文件夹名称的其余部分始终不同。

我被困在这里:

@echo off
for /f "delims=" %%G In ('PowerShell -Command "&((Get-Date).AddMonths(-1)).ToString('yyyy')"') do set "ano=%%G" 

for /f "delims=" %%A In ('PowerShell -Command "&((Get-Date).AddMonths(-1)).ToString('MM-')"') do set "mes=%%A" 

set "winrar=C:\Program Files\winrar"
"%winrar%\rar.exe" a -ibck -ep1  "C:\FOLDER 1\FOLDER 2\FOLDER 3\%ano%\????????.rar"

我只有关于文件夹的名字部分的信息,例如04-

如何指定Rar.exe 以仅按第一个文件夹名称压缩文件夹?

【问题讨论】:

我将假设04-%mes% 直接相关,因此很明显,如果您提供的目录使用%ano%,则它不适用于使用的字符串04-完全不同的格式。请再努力解释一下代码和题体之间的关系。 %ano% 仅用于获取正确的文件夹年份。 %mes% 只是我知道我要压缩的文件夹的名字。一个程序生成一个名为%mes%+ uknown name 的文件夹。所以当这个月,我想压缩这个以前的文件夹。我每个月都必须这样做。因此,为此创建一个脚本将有助于我的工作。 FOR /D %%G IN ("C:\FOLDER 1\FOLDER 2\FOLDER 3\%ano%\%mes%*") do set "folder=%%G" 当然,在 powershell.exe 的单个实例中获取目录名称会更有效。例如For /F "Delims=" %%G In ('%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile "$d = ((Get-Date).AddMonths(-1)).ToString(\"yyyy\\MM-\")+\"*\"; (Get-Item \"C:\FOLDER 1\FOLDER 2\FOLDER 3\$d\").FullName"') Do @Echo %%G 非常感谢你们!你真的帮了我很多! 【参考方案1】:

我建议阅读Time is set incorrectly after midnight 上的答案,以了解下面批处理代码的第一个 FOR 命令行,以便在不使用 PowerShell 的情况下获取当前年份和月份:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0"
for /F "tokens=1,2 delims=/" %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do set "Year=%%I" & set "Month=%%J" & goto CheckFolder
:CheckFolder
for /D %%I in (%Month%-*) do goto CompressFolders
echo INFO: There is no non-hidden folder with name: %Month%-*
goto EndBatch
:CompressFolders
set "ArchiveFolder=C:\FOLDER 1\FOLDER 2\FOLDER 3\%Year%"
md "%ArchiveFolder%" 2>nul
if not exist "%ArchiveFolder%\" echo ERROR: Failed to create folder: "%ArchiveFolder%"& goto EndBatch
"C:\Program Files\WinRAR\Rar.exe" a -cfg- -ep1 -idq -m5 -r -y "%ArchiveFolder%\%Month%.rar" "%Month%-*\*"
:EndBatch
popd
endlocal

该批处理文件将批处理文件目录中名称以当前月份和连字符开头的所有文件夹压缩成以当前月份为存档文件名的RAR存档文件。因此,例如,如果批处理文件目录包含文件夹 05-Folder05-OtherFolder,则 RAR 存档文件 05.rar 包含这两个文件夹及其所有文件和子文件夹。

当然也可以使用以下代码将名称以当前月份开头和连字符的每个文件夹压缩成单独的RAR存档文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0"
for /F "tokens=1,2 delims=/" %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do set "Year=%%I" & set "Month=%%J" & goto CheckFolder
:CheckFolder
for /D %%I in (%Month%-*) do goto CompressFolders
echo INFO: There is no non-hidden folder with name: %Month%-*
goto EndBatch
:CompressFolders
set "ArchiveFolder=C:\FOLDER 1\FOLDER 2\FOLDER 3\%Year%"
md "%ArchiveFolder%" 2>nul
if not exist "%ArchiveFolder%\" echo ERROR: Failed to create folder: "%ArchiveFolder%"& goto EndBatch
for /D %%I in (%Month%-*) do "C:\Program Files\WinRAR\Rar.exe" a -cfg- -ep1 -idq -m5 -r -y "%ArchiveFolder%\%%I.rar" "%%I\"
:EndBatch
popd
endlocal

该批处理文件创建 RAR 归档文件 05-Folder.rar05-OtherFolder.rar,文件夹名称为 05-Folder05-OtherFolder包含在相应的 RAR 归档文件中,因为 @ 中的反斜杠987654333@。文件夹名称 05-Folder05-OtherFolder 将包含在仅使用 "%%I" 的存档文件中。

请双击文件C:\Program Files\WinRAR\Rar.txt打开此文本文件并从上到下阅读。这是控制台版本Rar.exe的手册。开关-ibck 不在本手册中,因为这是GUI 版本WinRAR.exe 在后台运行的选项,这意味着最小化到系统托盘。 Rar.exe 命令行开关 -idq 用于在安静模式下创建仅显示错误的存档文件。

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

echo /? endlocal /? for /? goto /? if /? md /? popd /? pushd /? robocopy /? set /? setlocal /?

另请参阅single line with multiple commands using Windows batch file,了解在上述两个批处理文件中多次使用运算符&

【讨论】:

非常感谢您一直以来的详细解释和高效代码

以上是关于如何在不知道文件夹全名的情况下通过命令行将文件夹压缩为存档文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过命令行将 XML 文件导入“Charles Proxy > Map Local”

从命令行将数据从csv文件加载到oracle表[关闭]

如何在不启动 Maya 的情况下执行 Maya 脚本?

如何通过命令行将文件加载到球拍中?

如何通过命令行将 Python Notebook 转换为 Python 文件?

在不知道列顺序的情况下通过 Polybase 摄取 CSV 文件