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

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

Ответить
Настройки темы
CMD/BAT - [решено] работа с переменными

Пользователь


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

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


Добрый день!

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

сейчас он такой
Код: Выделить весь код
rem @echo off

ARJ32.exe m -e C:\testbat\2\AN03722%date:~8,2%%date:~3,2%%date:~0,2%0000 C:\testbat\1\s*_*_*_1*.txt
ARJ32.exe m -e C:\testbat\2\BN03722%date:~8,2%%date:~3,2%%date:~0,2%0000 C:\testbat\1\s*_*_*_7*.txt
что нужно подправить:

1. 0000 это порядковый номер файла за день, нужно что бы он их начал считать (думаю что необходимо сделать так, что бы он записывал этот номер в *.тхт и сверял при следующем выполнении)

2. в имени этих s*_*_*_1*.txt и s*_*_*_7*.txt файлов цифра "1" и цифра "7" могут меняться на "0;1;2;6." и "3;4;5;7." соответственно - необходимо что бы он перебирал эти цифры и паковал в архивы соответствующие

заранее огромное спасибо!

Отправлено: 09:02, 27-06-2014

 

Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
cls

Set "Out=Q:\testbat\2"
Set "In=Q:\testbat\1"

Set "Dt=%date:~8,2%%date:~3,2%%date:~0,2%"

SetLocal EnableExtensions EnableDelayedExpansion

Call :Number  "%Out%" "AN03722" "%In%" "0 1 2 6"
Call :Number  "%Out%" "BN03722" "%In%" "3 4 5 7"

GoTo :Eof

:Number
Set "P_N=%~2"
Set "M_N=%~1\%P_N%%Dt%"
Set "Out_N=%P_N%%Dt%0000"

FOR /F "usebackq delims=" %%i IN (`Dir /b /A:-D /O:-N "%M_N%????.*" 2^>Nul`) DO (
	Set "Out_N=%%~ni"
	GoTo :Continue
)
:Continue
Set NN=1%Out_N:~-4%

FOR %%N IN (%~4) DO (
	If Exist "%~3\s*_*_*_%%N*.txt" (
		Set /A NN=!NN!+1
		Echo ARJ32.exe m -e "%M_N%!NN:~-4!" "%~3\s*_*_*_%%N*.txt"
	)
)
Для "боевого" использования уберите Echo перед arj. У меня нет arj, подозреваю, команда m после архивации удаляет файлы. Батник смотрит на номер последнего за день архива и для новых архивов его наращивает

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 03-07-2014 в 22:37.

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

Отправлено: 12:40, 27-06-2014 | #2



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

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


Пользователь


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

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


Огромное спасибо за помощь!!!

да, вы правы, команда "m" удаляет файлы после архивации

батник шикарный, но есть пара "но"

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

этот батник пакует файлы с разным значениями "0 1 2 6" в разные архивы, а необходимо упаковать в один (если возможно, если нет, то подойдет и так), ну и для "3 4 5 7" аналогично.

ещё раз приношу извинения за неточность в написании просьбы...

Отправлено: 05:19, 28-06-2014 | #3


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
cls

Set "Out=Q:\testbat\2"
Set "In=Q:\testbat\1"

Set "Dt=%date:~8,2%%date:~3,2%%date:~0,2%"

Call :Number "%Out%" "AN03722" "%In%" "0 1 2 6" "Q:\testbat\2\AN_Log.log"
Call :Number "%Out%" "BN03722" "%In%" "3 4 5 7" "Q:\testbat\2\BN_Log.log"

GoTo :Eof

:Number

Set "P_N=%~2"
Set "M_N=%~1\%P_N%%Dt%"
Set "NN=10000"

If Exist %5 FOR /F "usebackq tokens=1,2" %%i IN (%5) DO (
	If %%i==%Dt% Set "NN=1%%j"
)

Set /A NN=%NN%+1

Set "LL=0"
FOR %%N IN (%~4) DO (
	If Exist "%~3\s*_*_*_%%N*.txt" (
		Echo ARJ32.exe m -e "%M_N%%NN:~-4%" "%~3\s*_*_*_%%N*.txt"
		Set "LL=1"
	)
)
If "%LL%"=="1" Echo %Dt% %NN:~-4%>%5
Для архивов AN и BN нужны отдельные лог файлы. Где их создавать, Вам виднее, лишь бы они не удалялись. Если их нет, они создадутся с текущей датой и номером 0001 (если были сделаны архивы).
Для "боевого" использования уберите Echo перед arj.
По видимому, надёжнее и проще сделать не
Код: Выделить весь код
Set "LL=0"
FOR ............................
If "%LL%"=="1" Echo %Dt% %NN:~-4%>%5
а
Код: Выделить весь код
FOR %%N IN (%~4) DO (
	If Exist "%~3\s*_*_*_%%N*.txt" (
		ARJ32.exe m -e "%M_N%%NN:~-4%.arj" "%~3\s*_*_*_%%N*.txt"
	)
)
If Exist "%M_N%%NN:~-4%.arj" Echo %Dt% %NN:~-4%>%5
, но у меня нет ARJ чтобы отладить этот кусок, я даже не уверен, делает ли ARJ32 архив с расширением arj и пополняется ли архив с добавлением нового файла (как это у rar, например).

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 03-07-2014 в 22:39. Причина: Уточнение кода

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

Отправлено: 19:14, 28-06-2014 | #4


Пользователь


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

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


Оба варианта прекрасно работают!

если вы говорите, что второй вариант лучше, буду использовать его!

выражаю огромную благодарность!!!

Отправлено: 22:35, 28-06-2014 | #5


Пользователь


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

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


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

ткните, пожалуйста, носом, что я не так делаю...

есть файлы PS*_2763_0020_N_*_2763_0020.xml отличаются только цифрой "N", для цифр "1 2 3 4 9" должен быть вид архива PSEI_2763_0020_GGGGMMDD_nnn, а для "5 6" - PSKR_2763_0020_GGGGMMDD_nnn.arj

я подправил так, работает, но почему то не пишет лог и естественно не дает следующий № за день
Код: Выделить весь код
@Echo Off
cls
rem 311
Set "Out=C:\testbat\ps"
Set "In=C:\testbat\ps"

Set "Dt=%date:~6,4%%date:~3,2%%date:~0,2%"

Call :Number "%Out%" "PSEI_2763_0020_" "%In%" "1 2 3 4 9" "C:\testbat\ps\PSEI_Log.log"
Call :Number "%Out%" "PSKR_2763_0020_" "%In%" "5 6" "C:\testbat\ps\PSKR_Log.log"

GoTo :Eof

:Number

Set "P_N=%~2"
Set "M_N=%~1\%P_N%%Dt%"
Set "NN=1000"

If Exist %5 FOR /F "usebackq tokens=1,2" %%i IN (%5) DO (
	If %%i==%Dt% Set "NN=1%%j"
)

Set /A NN=%NN%+1

FOR %%N IN (%~4) DO (
	If Exist %In%\PS*_*_*_%%N_*_*_*.xml (
		ARJ32.exe m -e "%M_N%_%NN:~-3%.arj" "%~3\PS*_*_*_%%N_*_*_*.xml"
	)
)
If Exist "%M_N%%NN:~-3%.arj" Echo %Dt% %NN:~-3%>%5
прошу, расскажите, что я не так сделал, я пытаюсь учится разбираться в батниках, но мне это сложно дается

а ещё, после него мне нужно запустить простейшую команду архивации оставшихся файлов, но она запускается параллельно, и захватывает файлы из прошлого списка, как сделать так, что бы следующая команда дождалась завершение прошлой операции?

Последний раз редактировалось Anufriev, 01-07-2014 в 17:07.


Отправлено: 14:22, 01-07-2014 | #6


Ветеран


Contributor


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

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


Попробуйте так:
Код: Выделить весь код
@Echo Off

Set "Out=Q:\testbat\ps"

Set "Pre=PS*_2763_0020_"
Set "End=_*_2763_0020.xml"

Set "In=Q:\testbat\ps"

Set "MaskOther=*.xml"

Set "Dt=%date:~8,2%%date:~3,2%%date:~0,2%"

Call :Number  "%Out%" "PSEI_2763_0020_" "%In%" "1 2 3 4 9" "Q:\testbat\ps\PSEI_Log.log"
Call :Number  "%Out%" "PSKR_2763_0020_" "%In%" "5 6" "Q:\testbat\ps\PSKR_Log.log"
Call :Number  "%Out%" "Other_" "%In%" "" "Q:\testbat\ps\Other_Log.log"

GoTo :Eof

:Number

Set "P_N=%~2"
Set "M_N=%~1\%P_N%%Dt%"
Set "NN=1000"

If Exist %5 FOR /F "usebackq tokens=1,2" %%i IN (%5) DO (
	If %%i==%Dt% Set "NN=1%%j"
)

Set /A NN=%NN%+1

Set "LL=0"

If Not %4==""  (

FOR %%N IN (%~4) DO (
	If Exist "%~3\%Pre%%%N%End%" (
		Echo ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%Pre%%%N%End%"
		Set "LL=1"
	)
)
) Else (
	If Exist "%~3\%MaskOther%" (
		Echo ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%MaskOther%"
		Set "LL=1"
	)
)

If "%LL%"=="1" Echo %Dt% %NN:~-3%>%5
Опять я вставил для отладки перед arj Echo, которое при боевом применении надо убрать. И снова кусок, который я не тестировал, но который, я считаю, предпочтительнее того, что вверху
Код: Выделить весь код
If Not %4==""  (

FOR %%N IN (%~4) DO (
	If Exist "%~3\%Pre%%%N%End%" (
		ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%Pre%%%N%End%"
	)
)
) Else (
	If Exist "%~3\%MaskOther%" (
		ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%MaskOther%"
	)
)

If Exist "%M_N%%NN:~-3%.arj" Echo %Dt% %NN:~-3%>%5
В вызове процедуры вместо "C:\testbat\ps\PSEI_Log.log" если лог файлы там же, куда создаются архивы, резонно написать, например, "%Out%\PSEI_Log.log". Вы вольны располагать лог-файлы где Вам нравится, лишь бы они не удалялись.

Кстати, в предыдущей задаче правильнее вместо
If Exist %In%\s*_*_*_%%N*.txt написать
If Exist "%~3\s*_*_*_%%N*.txt" так как %In% передаётся %3 аргументом

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 03-07-2014 в 22:52.

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

Отправлено: 22:20, 03-07-2014 | #7


Пользователь


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

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


благодарю!!!

вопросик, а почему вы out и in раскидали, для эстетики можно же их поставить рядом? ну и с масками тот же вопрос

Код: Выделить весь код
Set "Out=Q:\testbat\ps"

Set "Pre=PS*_2763_0020_"
Set "End=_*_2763_0020.xml"

Set "In=Q:\testbat\ps"

Set "MaskOther=*.xml"

Отправлено: 08:16, 04-07-2014 | #8


Ветеран


Contributor


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

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


Цитата:
для эстетики можно же их поставить рядом?
Для читаемости. Весь этот код можно вообще ужать. Например, наваять вместо имеющегося вот такой кусок:
Код: Выделить весь код
Set "LL=0"
If Not %4=="" FOR %%N IN (%~4) DO If Exist "%~3\%Pre%%%N%End%" Echo ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%Pre%%%N%End%" & Set "LL=1"
If %4=="" If Exist "%~3\%MaskOther%" Echo ARJ32.exe m -e "%M_N%%NN:~-3%.arj" "%~3\%MaskOther%" & Set "LL=1"
If "%LL%"=="1" Echo %Dt% %NN:~-3%>%5
Счастья прибавилось?? Можно поубирать большинство Set, то, что в Set, вставить напрямую в код. Чтобы он был короче. Читать его будет трудно. Например Что-то изменить-вставить - ломай голову через неделю. Вообще, код без коментариев - полное корявство. Но лень ...

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 11:31, 04-07-2014 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Работа с переменными в цикле DarkDream604 Скриптовые языки администрирования Windows 5 03-03-2015 16:19
Любой язык - [решено] Старт bata с переменными. _Parkan_ Скриптовые языки администрирования Windows 2 11-01-2012 19:31
CMD/BAT - затруднения в работе с переменными cher Скриптовые языки администрирования Windows 3 23-06-2011 21:46
проблема с переменными окружения Vasosel Microsoft Windows NT/2000/2003 2 12-07-2006 14:21
PHP. Финты ушами с переменными и функциями. Prisoner Вебмастеру 6 28-06-2005 10:51




 
Переход