batch-file - 如果找到的文件夹没有另一个同名的子文件夹,请执行操作
问题描述
我正在尝试创建一个批处理文件脚本,它将压缩目录中命名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\"
)
)
请询问是否有任何不清楚的地方!我真的希望将上述内容转换为功能代码,提前感谢您的任何输入或想法。
解决方案
@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 括号确保压缩时的当前目录是要压缩的叶子。
推荐阅读
- javascript - 什么 import {} from '.' 做?
- botframework - 使用与网站相同的身份验证令牌对 Bot 进行身份验证
- javascript - 未找到 firebase-messaging.js laravel
- mongodb - 插入大多边形时无法提取地理键
- scala - 如何正确退出 sbt 运行?
- c# - NAudio 选择扬声器/耳机(Realtek 高保真音频)
- gnu-assembler - PDP-11 的 GNU 汇编器不检查 BR 范围限制
- angular - NgRx reducer 中的拼接索引不删除一个索引
- java - 硒Java。将文本放在 div 元素中:元素不可交互
- c# - 如何在 C# 中强制关闭命令行窗口