Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   распаковать все файлы с расширением 7z в каталог, содержащий текущую дату (http://forum.oszone.net/showthread.php?t=230939)

Sylest 21-03-2012 20:42 1884192

распаковать все файлы с расширением 7z в каталог, содержащий текущую дату
 
Здравствуйте.

Требуется помощь в написании bat-файл.

Задача: из заданного в командной строке каталога распаковать все файлы с расширением 7z в каталог, содержащий текущую дату. Используя цикл FOR, ввести проверку ошибок: в каталоге нет ни одного файла с расширением 7z.

Своими силами написал следующий код код:
Код:

cls
set exist=1
for %%f in ("%USERPROFILE%"\"Рабочий стол"\bat\batnik.7z) do "C:\Program Files\7-Zip\7z.exe" x %1 -oc:\mybatcatalog\"%date%" 
set exist=0
if %exist%==0 echo Нет ни одного файла с расширением 7z

По какой-то причине, в написанном не происходит проверка по условию (наличие архива в каталоге).


Заранее благодарен.

P.S. Требуется реализация именно через for, ни как иначе.

Iska 21-03-2012 21:52 1884250

Цитата:

Цитата Sylest
в каталог, содержащий текущую дату »

А где должен располагаться сам этот каталог? В текущем?

Примерно так (если не брать извращения с проверкой наличия файлов по «for» вместо «exist»):
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=%~1

if defined sFolder (
        if exist "%sFolder%\*.7z" (
                call :GetPathTo7Zip
               
                if defined PathTo7Zip (
                        if exist "!PathTo7Zip!7z.exe" (
                                "!PathTo7Zip!7z.exe" x "%sFolder%\*.7z" -o%date% -y *
                        ) else (
                                echo Can't find 7-Zip executive in [!PathTo7Zip!]
                        )
                ) else (
                        echo Can't find path to 7-Zip executive
                )
        ) else (
                echo Not found any 7-zip archivies in [%sFolder%]
        )
) else (
        echo Usage: %~nx0 ^<Path^>
)

endlocal
exit /b 0

:GetPathTo7Zip
        setlocal enableextensions enabledelayedexpansion
        set sOut=%~0
       
        for /f "usebackq tokens=3 delims=        " %%i in (
                `reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul ^| find.exe /i "Path"`
        ) do set sPath=%%i
       
        endlocal & set %sOut:~4%=%sPath%
        exit /b


Sylest 21-03-2012 22:06 1884265

Цитата:

А где должен располагаться сам этот каталог?
Самостоятельно задаем в bat-файле каталог, в котором будет создан новый. Но можно выполнить и в текущем.

Цитата:

если не брать извращения с проверкой наличия файлов по «for» вместо «exist»
К сожалению с for - это обязательное условие.

Iska 22-03-2012 01:59 1884361

Я даже не особо представляю, как сие может выглядеть. Ну, давайте попробуем прикрутить «for» искусственно, например:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=%~1

call :GetPathTo7Zip

if defined sFolder (
        if defined PathTo7Zip (
                if exist "%PathTo7Zip%7z.exe" (
                        (
                                for %%i in ("%sFolder%\*.7z") do "%PathTo7Zip%7z.exe" x "%%~fi" -o%date% -y *
                        ) || echo Not found any 7-zip archivies in [%sFolder%]

                ) else (
                        echo Can't find 7-Zip executive in [%PathTo7Zip%]
                )
        ) else (
                echo Can't find path to 7-Zip executive
        )
) else (
        echo Usage: %~nx0 ^<Path^>
)

endlocal
exit /b 0

:GetPathTo7Zip
        setlocal enableextensions enabledelayedexpansion
        set sOut=%~0
       
        for /f "usebackq tokens=3 delims=        " %%i in (
                `reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul ^| find.exe /i "Path"`
        ) do set sPath=%%i
       
        endlocal & set %sOut:~4%=%sPath%
        exit /b


gora 22-03-2012 10:16 1884466

Iska
1 Добавил в конец Pause, иначе не мог увидеть сообщений
2 Запуск батника производил без параметров, поэтому исправил (только для тестов) строку
Код:

set sFolder=%~dp0
2.1 На Win7 x64 получил Can't find path to 7-Zip executive хотя 7-Zip у меня разумеется стоит и ключи на месте.
2.2 На Win XP получил Can't find 7-Zip executive in [c:\Program Files\7-Zip] Причина: разные инсталляторы 7-Zip по разному пишут путь в реестр, msi пишут с завершающим слешем, а exe без оного.
3 Присвоение переменной %PathTo7Zip% оригинально, но для начинающих будет непонятно. К тому же при любом (без знаний метода формирования переменной) изменении имени переменной и\или имени п\п :GetPathTo7Zip приведет к непредсказуемым результатам.
4 После того как подправил получение пути батник заработал, но...
4.1 При отсутствии архивов в папке сообщение Not found any 7-zip archivies in [%sFolder%] не вывелось
4.2 После добавления в папку запароленного архива (получилось это случайно), батник на нем остановился для ввода пароля. Ввел неправильный пароль (правильный просто не помню) и получил сообщение Not found any 7-zip archivies in [E:\Temp\]
4.2.1 Но если этот запароленный архив не будет последним в списке обрабатываемых архивов, то сообщение снова не выводится

Немного подправил Ваш вариант и получилось это:
Код:

@Echo Off
Setlocal EnableExtensions

Set sFolder=%~1
:: Set sFolder=%~dp0
Set "flag="
Set "PathTo7Zip="

If Not Defined sFolder Call :_abort "Usage: %~nx0 [Path]"
If "%sFolder:~-1%"=="\" Set sFolder=%sFolder:~0,-1%
For %%i In ("%sFolder%\*.7z") Do Set flag=1
If Not Defined flag Call :_abort "Not found any 7-zip archivies in [%sFolder%]"
For /f "tokens=2*" %%i In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul') Do Set PathTo7Zip=%%j
If Not Defined PathTo7Zip Call :_abort "Can't find path to 7-Zip executive"
If Not "%PathTo7Zip:~-1%"=="\" Set PathTo7Zip=%PathTo7Zip%\
If Not Exist "%PathTo7Zip%7z.exe" Call :_abort "Can't find 7-Zip executive in [%PathTo7Zip%]"
For %%i In ("%sFolder%\*.7z") Do "%PathTo7Zip%7z.exe" x "%%~fi" -o%date% -y -ppassword>nul
Call
:_abort "Unpacking is complete"

:_abort
Echo.
Echo        %~1
Echo.
Pause
Endlocal
Exit



Время: 10:07.

Время: 10:07.
© OSzone.net 2001-