首页 > 解决方案 > 如果找到的文件夹没有另一个同名的子文件夹,请执行操作

问题描述

我正在尝试创建一个批处理文件脚本,它将压缩目录中命名folder1的所有子文件夹,但是如果它不包含另一个同名的子文件夹,它应该只压缩这个文件夹。

我对 cmd 和批处理文件很陌生,这也是我第一篇关于堆栈溢出的帖子,如果我未能提供一些我应该提供的信息,请告诉我!

下面的一些伪代码有望说明我想要完成的工作:

@echo off
SETLOCAL EnableDelayedExpansion

FOR /D /R %%G IN (*folder1*) DO (
   CD %%G
   SET /A compress=true
   FOR /D /R %%H IN (*folder1*) DO (
      ECHO folder contains another folder of same name, should not be compressed
      SET /A compress=false
   )
   IF !compress!==true (
      ECHO Run compression operation on folder
      "C:\Program Files (x86)\7-zip\7z.exe" a -tzip "%%G.zip" "%%G\"
   )
)

请询问是否有任何不清楚的地方!我真的希望将上述内容转换为功能代码,提前感谢您的任何输入或想法。

标签: batch-file

解决方案


@ECHO OFF
SETLOCAL
:: Starting directory
SET "sourcedir=U:\sourcedir"
:: name of directory to compress
SET "targetname=targetdir"
FOR /d /r "%sourcedir%" %%a IN (*) DO (
  IF /i "%%~nxa" == "%targetname%" IF NOT EXIST "%%a\%targetname%\." (
   ECHO compress %%a
   rem temporarily switch to target directory
   PUSHD "%%a"
   ECHO 7z a -tzip "%%a.zip" 
   rem back to original directory
   POPD
  )
)

GOTO :EOF

这应该如你所愿 - 它会显不执行7z命令。

查看if目录名的“名称和扩展名”部分是否%%a与目标匹配(/i使匹配不区分大小写)。如果匹配并且存在具有所需名称的子目录,则执行压缩部分。

有两点需要考虑。

首先,目标 ZIP 文件的名称。如您所写,生成的 ZIP 将folder1.zip位于父目录中。IDK 你想要什么。此代码将执行相同的操作,但%%a.zip可以替换为,..\%targetname%.zip因为pushd/popd将当前目录更改为folder1目录并且..意味着the parent directory.

第二件事是您是否要压缩...\folder1\folder1(它的目标 ZIP 文件为...\folder1\folder1.zip


修订给出评论:

@ECHO OFF
SETLOCAL
:: Starting directory
SET "sourcedir=U:\sourcedir"
:: name of directory to compress
SET "targetname=targetdir"
REM (
FOR /d /r "%sourcedir%" %%a IN (*) DO IF /i "%%~nxa" NEQ "%targetname%" (
 rem calculate parent name in %%~nxp and grandparent in %%~nxg
 FOR %%p IN ("%%~dpa.") DO FOR %%g IN ("%%~dpp.") DO (
  IF /i "%%~nxp" == "%targetname%" IF /i "%%~nxg" NEQ "%targetname%" (
   ECHO child   %%~nxa 
   ECHO parent  %%~nxp
   ECHO Gparent %%~nxg   Gppath=%%~dpg
   ECHO compress %%a
   rem temporarily switch to target directory
   PUSHD "%%a"
   ECHO 7z a -tzip "%%a.zip" 
   ECHO -------------------
   rem back to original directory
   POPD
  )
 )
)

GOTO :EOF

不清楚您想对名为的目录做...\folder1\folder1\something什么或目标 ZIP 文件名应该是什么。

if中的for /d /r将确保只处理与目标名称不匹配的叶子名称。然后将路径名%%a处理为父级和祖父级部分 - 请注意,%%~dp?驱动器+路径部分%%?终止\,因此附加.到此解决有效地删除终端\产生“文件名”。

您似乎想要压缩具有父级但没有以目标字符串命名的祖父级的目录,因此是最里面的if语句。

我刚刚echo编辑了此时可用的各种字符串,因此可以根据需要将它们串在一起以形成您的目标 ZIP 文件名。请注意,pushd/popd 括号确保压缩时的当前目录是要压缩的叶子。


推荐阅读