Итерация по папкам и файлам в пакетном файле?

Итерация по папкам и файлам в пакетном файле?

Вот моя ситуация. Целью проекта является перенос некоторых приложений в другую систему.

Эти вложения будут размещены в родительской папке, скажем, « Folder 0» (см.диаграмма этого вопросадля лучшего понимания), и они будут заархивированы/сжаты.

Я хочу, чтобы мой пакетный скрипт вызывался так:

BatchScript.bat "c:\temp\usd\Folder 0"

Я использую его 7za.exeв качестве инструмента для извлечения из командной строки.

Я хочу, чтобы мой пакетный скрипт выполнил итерацию по Folder 0подпапкам " " и извлек все содержащиеся в них ZIP-файлы в соответствующие папки.

Обязательно, чтобы извлеченные файлы находились в той же папке, что и соответствующие им ZIP-файлы. Таким образом, файлы, содержащиеся в " File 1.zip", необходимо разместить в " Folder 1" и так далее.

Я прочитал оFOR...DOкоманда наWindows XP Professional Product Documentation - Using Batch Files.

Вот мой сценарий:

@ECHO OFF

FOR /D %folder IN (%%rootFolderCmdLnParam) DO 
    FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile

Полагаю, что мне также нужно будет изменить фактический каталог перед вызовом 7za.exe e %zippedFile для извлечения файла, но я не могу понять, как это сделать в этом пакетном файле (хотя я знаю, как это сделать в командной строке, и даже если я знаю, что это та же инструкция «cd»).

ПРАВКА №1

Оба приведенных ниже ответа близки к тому, что мне нужно. Но по каким-то неизвестным причинам иногда пакетный файл, когда я даю параметр, просто ничего не делает и возвращает меня к приглашению.

Я не писал пакетные файлы уже около 15 лет, поэтому совершенно забыл о логике и т. д.

Кто-нибудь может помочь, пожалуйста?

ПРАВКА №2

Кажется, без какой-либо уверенности, что скрипт пакетного файла не может обрабатывать имена папок с символом пробела. Может ли кто-нибудь из вас подтвердить и предложить решение для борьбы с этим, пожалуйста?

Я тут совсем слепну... Спасибо за помощь! =)

ПРАВКА №3

Мне нужно, чтобы решение было полностью рекурсивным, так как я не знаю структуру каталогов, против которых это будет использоваться. Извините, что не упомянул об этом раньше.

ПРАВКА №4

Все ваши ответы и ответы других людей вдохновили меня на следующее (что работает на 98%):

@echo off

setlocal enableextensions enabledelayedexpansion

rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
    echo Syntaxe : od.bat ^<directory mask>^
    echo Exemple : od.bat *
    goto :Eof
)

rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%

rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%

rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
    echo Traitement du dossier : "%%d"

    for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
        rem Getting filename without extension.
        set subfolder=~n%f
        mkdir "%%d\%subfolder%"
        rem Extracting zipfile content to the newly created folder.
        7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
    )
)

:Eof

endlocal

Единственная проблема, с которой я сталкиваюсь, заключается в том, что он хочет создать, придерживаясь моего примера, File5подпапку, чтобы извлечь zip-файл в нее. Это не проблема при извлечении самого File5.zipфайла. Но когда он копает глубже в структуре каталогов в подпапки, так как он получил последнее File5имя файла, он хочет создать подпапку File5 в Folder 1\Folder A, например, чтобы извлечь File1.zip. Вот пример структуры:


║═════ Folder 1
║         ║
║         ║══════ Folder A
║                     ║
║                     ║═════ File1.zip
║═════ Folder 5
          ║═════ File5.zip

Таким образом, принимая во внимание вышеприведенную структуру, он хочет создать File5в Folder A, хотя вместо этого он должен намереваться создать File1.

Спасибо за вашу поддержку и помощь! =)

Мы будем благодарны за любую помощь.

ПРАВКА №5

Я принял ответ @Dennis Williamson, поскольку его решение удовлетворяет тому, о чем я спросил в первую очередь. В противном случае, если вы ищете полностью рекурсивное решение, перейдите по ссылке, указанной в моем собственном ответе, которая приведет вас на сайт StackOverflow.

решение1

Вы можете использовать PUSHDи POPD:

@echo off
set rootFolderCmdLnParam=%1
FOR /D %%d IN (%rootFolderCmdLnParam%\*) DO pushd %%d & (FOR %%z IN (*.zip) DO 7za.exe e "%%z") & popd 

Звоните так:

BatchScript.bat "c:\temp\usd\Folder 0"

решение2

Вот скрипт Windows .CMD, который может вам немного помочь.

Это не полное решение, но я надеюсь, что вы хотя бы почерпнете из него какие-то идеи.

REM @echo off
setlocal enableextensions enabledelayedexpansion

  if /I "%1" EQU "" (
    echo Syntax: %0 ^<directory-mask^>
    echo Example:  %0 *
    goto :EOF
  )

  for /D %%a in (%1) do call :ProcessFolder "%%a"
  goto :EOF

:ProcessFolder
  rem Changing working directory to '%1'. See 'HELP PUSHD'
  pushd "%1"
  for %%b in (*.zip) do call :ProcessFile "%%b"
  popd
  goto :EOF

:ProcessFile
  rem Extract only filename-without-extension from %1 argument. See 'HELP FOR'
  set SUBFLDR=%~n1

  mkdir "%SUBFLDR%"
  pushd "%SUBFLDR%"

  echo Put processing here, like   7za.exe e "%1"

  popd
  goto :EOF

решение3

Вы также можете использовать FORFILES. EXE с ключом /S. Это также есть в Resource Kit.

решение4

Ответ, предоставленный @aphoria по ссылке ниже, позволяет скрипту быть полностью рекурсивным, создавать подпапку с тем же именем в zip-файле и т. д.

Вот ссылка на ответ на тот же вопрос на StackOverflow

Спасибо всем, вы все мне очень помогли.

Связанный контент