批处理 - 对仅在具有特定名称的文件夹中的文件执行操作

时间:2016-11-08 21:14:26

标签: windows batch-file automation 7zip

我有以下FOR声明:

 FOR /R %%i IN ("*.wmv") DO "7za.exe" -sdel a -mx0 -tzip -pPASSWORDHERE -mem=AES256 -y "%%~dpni.zip" "%%i" 

当在任何给定目录的根文件夹中运行时,它将压缩与定义的通配符匹配的所有文件(在本例中为wmv文件),生成加密的ZIP文件,保留原始名称。

我需要做的是告诉此脚本仅对具有特定名称的文件夹起作用。这是一个例子:

我有一个类似于此的目录结构(并且将在其中的子目录中包含wmv文件):

root
 |-20120211
   |-20
   |-21
 |-20130425
   |-34
   |-21
 |-20140516
   |-10
   |-22
 |-20150728
   |-230
   |-213
 and so on...

我需要做的是,例如,只压缩最后一个文件夹内的所有文件,文件名以2015 *开头

为了做到这一点,我尝试连接FOR语句,更具体地说,类似于:

 FOR /D %%P IN (2015*) DO (run my other FOR here)

但它唯一能完成的只是验证该结构中的文件夹名称是否匹配" 2015 *",如果它确实......那么......它只是拉链一切,所有文件夹中的所有文件,而不仅仅是那些以" 2015"。

开头的文件

我已经在网上搜索过,但没有找到可以帮助我的实际例子。如果你能帮助我实现这一目标,我会感激你=)

提前感谢一百万人!

2 个答案:

答案 0 :(得分:1)

FOR /D %%P IN (2015*) DO PUSHD "%%P"&(FOR /R %%i IN ("*.wmv") DO ECHO %%i)&POPD
在给出描述的情况下,

应该完成任务。

文件名只是echo ed。请记住,当前目录将是echo执行时的文件归档目录,因此用归档指令替换echo将需要指定所需的目标目录

答案 1 :(得分:0)

假设项目2021等也是包含所有*.wmv文件的文件夹,以下内容应该有效:

for /D %%D in ("root\2015*") do (
    for /D %%E in ("%%~D\*") do (
        for %%F in ("%%~E\*.wmv") do (
            "7za.exe" -sdel a -mx0 -tzip -pPASSWORDHERE -mem=AES256 -y "%%~dpnF.zip" "%%~F"
        )
    )
)

如果*.wmv文件也可能位于20150728等父文件夹中,您可以在for /R循环中嵌套for /D循环,如下所示:< / p>

for /D %%D in ("root\2015*") do (
    call :SUB "%%~D"
)
exit /B

:SUB
for /R "%~1" %%F in ("*.wmv") do (
    "7za.exe" -sdel a -mx0 -tzip -pPASSWORDHERE -mem=AES256 -y "%%~dpnF.zip" "%%~F"
)
exit /B

这里需要一个子例程,因为for /R不接受在for之后用作根的其他/R变量。这是因为根目录在非常早期的解析阶段应用,其中for变量尚未处理/扩展。