Показать полную графическую версию : [решено] работа с переменными
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.