我正在尝试创建一个批处理文件脚本,该脚本将压缩目录中名为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\"
)
)
请问一下是否有不清楚的地方!我真的很希望将以上内容转换为功能代码,在此先感谢您的任何投入或想法。
答案 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括号可确保压缩时的当前目录是要压缩的叶子。