PDA

Показать полную графическую версию : [решено] работа с переменными


Anufriev
27-06-2014, 09:02
Добрый день!

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

сейчас он такой
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." соответственно - необходимо что бы он перебирал эти цифры и паковал в архивы соответствующие

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

megaloman
27-06-2014, 12:40
@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 после архивации удаляет файлы. Батник смотрит на номер последнего за день архива и для новых архивов его наращивает

Anufriev
28-06-2014, 05:19
Огромное спасибо за помощь!!!

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

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

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

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

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

megaloman
28-06-2014, 19:14
@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, например).

Anufriev
28-06-2014, 22:35
Оба варианта прекрасно работают!

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

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

Anufriev
01-07-2014, 14:22
пытаюсь переделать этот батник под подобную работу, но с другими именами файлов, но так как руки из попы, у меня нифига не получается

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

есть файлы 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


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

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

megaloman
03-07-2014, 22:20
Попробуйте так:
@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 аргументом

Anufriev
04-07-2014, 08:16
благодарю!!!

вопросик, а почему вы 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"

megaloman
04-07-2014, 11:31
для эстетики можно же их поставить рядом? Для читаемости. Весь этот код можно вообще ужать. Например, наваять вместо имеющегося вот такой кусок: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, вставить напрямую в код. Чтобы он был короче. Читать его будет трудно. Например Что-то изменить-вставить - ломай голову через неделю. Вообще, код без коментариев - полное корявство. Но лень ...




© OSzone.net 2001-2012