Вот моя ситуация. Одной из целей проекта является перенос некоторых вложений в другую систему.
Эти вложения будут размещены в родительской папке, скажем "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.
Ты можешь использовать 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"
Вот сценарий 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
Вы также можете использовать FORFILES. EXE с переключателем / S. Это также есть в Resource Kit.
Ответ, предоставленный @aphoria по ссылке ниже, позволяет сценарию быть полностью рекурсивным, создавать подпапку с тем же именем zip-файла и т. Д.
Вот ссылка на ответ на тот же вопрос в StackOverflow
Спасибо всем, вы очень мне помогли.