如果找到的文件夹没有另一个同名子文件夹,请执行操作

时间:2019-03-31 17:18:52

标签: batch-file

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

我对cmd和批处理文件非常陌生,这也是我第一次堆栈溢出,请告诉我是否未能提供一些我应该提供的信息!

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

@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\"
   )
)

请问一下是否有不清楚的地方!我真的很希望将以上内容转换为功能代码,在此先感谢您的任何投入或想法。

1 个答案:

答案 0 :(得分:0)

@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

这应该随您所愿-将{em>执行而不执行7z命令。

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

有两点要考虑。

首先,是目标ZIP文件的名称。如您所写,生成的ZIP将在父目录中为folder1.zip。 IDK您在这里想要什么。该代码将执行相同的操作,但是%%a.zip可以替换为..\%targetname%.zip,因为pushd/popd将当前目录更改为folder1目录,而..的意思是{{ 1}}。

第二件事是您是否要压缩the parent directory(目标ZIP文件为...\folder1\folder1


修订给出评论:

...\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 的目录做什么还是目标ZIP文件名是什么。

...\folder1\folder1\something行中的if将确保仅处理与目标名称不匹配的叶子名称。然后for /d /r中的路径名被处理为父部分和祖父母部分-请注意,%%a%%~dp?的驱动器+路径部分,该部分以%%?结尾,因此附加{{ 1}}的目的在于有效删除终端\并产生一个“文件名”。

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

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