@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
в родительском каталоге. ИДК, что вы хотите здесь. Этот код будет делать то же самое, но %%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 гарантирует, что текущий каталог во время сжатия является листом для сжатия.