Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - распаковать все файлы с расширением 7z в каталог, содержащий текущую дату

Ответить
Настройки темы
CMD/BAT - распаковать все файлы с расширением 7z в каталог, содержащий текущую дату

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте.

Требуется помощь в написании 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, ни как иначе.

Отправлено: 20:42, 21-03-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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

Отправлено: 21:52, 21-03-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 22:06, 21-03-2012 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Я даже не особо представляю, как сие может выглядеть. Ну, давайте попробуем прикрутить «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

Отправлено: 01:59, 22-03-2012 | #4


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось gora, 22-03-2012 в 12:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:16, 22-03-2012 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - распаковать все файлы с расширением 7z в каталог, содержащий текущую дату

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Как получить текущую дату и время в интернете? white155 Скриптовые языки администрирования Windows 8 29-05-2012 04:00
CMD/BAT - копирование файлов за текущую дату с сервера на сервер 6a6yko Скриптовые языки администрирования Windows 10 21-06-2011 13:00
нужно чтобы все графические файлы отображались с расширением jpg а не bmp Полосатый 777 Хочу все знать 2 29-04-2011 12:13
CMD/BAT - файлы вида mmdd*.* - для каждой даты нужно создать каталог, скопировать, файлы milito Скриптовые языки администрирования Windows 2 24-05-2009 23:32
Не удаётся распаковать закачанные файлы аудиокниг vladisk Видео и аудио: обработка и кодирование 3 02-09-2007 19:00




 
Переход