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

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

Эти вложения будут расположены к родительской папке, скажем,"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

Я уже получил некоторые подсказки относительно ServerFault к тому же вопросу. См. ответы в этой ссылке.

Однако это извлекло из корня (C:), а не от данного в папке параметра.

У кого-либо есть идея?

РЕДАКТИРОВАНИЕ № 2

Кажется, что сценарий пакетной обработки не обрабатывает имена папок и имена файлов, содержащие пробел соответственно. Кто-либо может подтвердить то, что я думаю?

РЕДАКТИРОВАНИЕ № 3

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

ОТРЕДАКТИРУЙТЕ # 4.a

С решением @aphoria я почти там! Единственная проблема состоит в том, что это берет скажем, File5.zip, получите имя файла только для получения File5, создает подпапку File5 и извлечение File5.zip кому: File5 подпапка, затем, это хочет создать a File5 подпапка в Folder 1, где это должно вместо этого хотеть создать File1 подпапка, чтобы придерживаться моего примера.

ОТРЕДАКТИРУЙТЕ # 4.b

Как требуется вот код, поскольку это в настоящее время смотрит:

@echo off

setlocal enableextensions enabledelayedexpansion

rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
    echo Syntaxe : od.bat ^^
    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

Идеи кто-либо?

Мое предположение - то, что это роет одну иерархию каталогов за один раз. Вот соглашение. Полагайте, что у нас есть a Folder A в Folder 1 (Папка 1\Folder А), затем, это ищет от Folder 1 через Folder 5, и возвращается к Folder 1\Folder A, где %subfolder переменная % придерживается своего последнего значения.

Чья-либо справка с благодарностью ценится.

5
задан Community 13 April 2017 в 12:13
поделиться

1 ответ

Я не очень хорошо знаком с опциями командной строки 7zip, поэтому вам нужно будет выяснить точную команду для этого, но приведенный ниже скрипт примет полностью указанный путь (пробелы разрешены) и выведет имя папки и .zip-файлы, содержащиеся в ней.

@ECHO OFF

REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%

FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO ( 
  ECHO %%d
  FOR /F "DELIMS==" %%f in ('DIR "%ROOT%\%%d\*.zip" /B') DO (
    ECHO   %%f
  )
)  


Запустите его следующим образом:

MyScript.CMD "c:\temp\usd\Folder 0"

Вы должны получить результат, подобный этому:

Folder A
  File 1.zip
  File 2.zip
Folder B
  File 1.zip
  File 2.zip  


UPDATE

Код ниже извлечет Папка A\File 1.zip в новую папку Папка A\File 1.

Несколько моментов, о которых следует помнить:

  1. В первом цикле FOR нужно, чтобы %ROOT% был заключен в двойные кавычки для работы с папками с пробелами в имени.
  2. Поскольку вы SETтируете переменную внутри второго FOR, вам нужно поместить SETLOCAL ENABLEDELAYEDEXPANSION в начало. Затем ссылайтесь на переменную с помощью ! (например, !subfolder! ) для принудительного расширения во время выполнения.
  3. Эта строка вашего кода set subfolder=~n%f должна быть такой set subfolder=%%~nf
  4. Я поставил ECHO перед командами MKDIR и 7za.exe для проверки. Когда вы убедитесь, что она выполняет то, что вы хотите, удалите оператор ECHO.

Вот код:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%

REM Searching directory structure from root for subfolders and zipfiles,
REM 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=%%~nf
        ECHO mkdir "%%d\!subfolder!"
        REM Extracting zipfile content to the newly created folder.
        ECHO 7za.exe e "%%d\%%f" -o"%%d\!subfolder!"
    )
)

ENDLOCAL
8
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: