Выполните операцию, если найденная папка НЕ ​​имеет другой подпапки с тем же именем - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать сценарий пакетного файла, который будет сжимать все подпапки с именем 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\"
   )
)

Пожалуйста, спросите, если что-то кажется неясным! Я действительно надеюсь превратить все вышеперечисленное в функциональный код, заранее благодарю за любой вклад или мысли.

1 Ответ

0 голосов
/ 31 марта 2019
@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 гарантирует, что текущий каталог во время сжатия является листом для сжатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...