|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Размножить bat |
|
|
CMD/BAT - [решено] Размножить bat
|
Ветеран Сообщения: 531 |
Профиль | Отправить PM | Цитировать Здравствуйте, есть код
for /f "delims=" %%i in (categories.txt) do ( echo setlocal %%i >>"%%i.bat" echo setlocal enableextensions %%i >>"%%i.bat" ) Вопрос.. а можно ли как - то вместить вторую переменную? Я хочу ее вставить в текст, она также должна заменяться на то, что в другом txt файле.. Примерно вот так (конечно это работать не будет): |
|
Отправлено: 01:29, 10-07-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Alexander_88:
|
|
Отправлено: 05:43, 10-07-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Alexander_88, Как понять: в файле categories.txt и names.txt одинаковое число строк? Надо последовательно выдернуть первую, вторую итд строки в categories.txt и в names.txt и что-то с ними делать?
Как-то так?
@Echo Off cls Set "BoxOut=Z:\Box_Out" Call :Var "Z:\Box_In\categories.txt" "@@cat" Call :Var "Z:\Box_In\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call Set "Cat=%%@@cat%i%%%" Call Set "Nam=%%@@nam%i%%%" If "%Cat%"=="" GoTo :Cont &If "%Nam%"=="" GoTo :Cont >>"%BoxOut%\%Cat%.bat" ( echo setlocal %Cat% echo setlocal enableextensions %Nam% ) GoTo :Begin :Cont Pause Exit /B :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B |
------- Последний раз редактировалось megaloman, 10-07-2019 в 09:05. Отправлено: 06:54, 10-07-2019 | #3 |
Ветеран Сообщения: 531
|
Профиль | Отправить PM | Цитировать спасибо, проверил, работает, только на реальной задаче не работает (только на примере), видимо какие - то символы запрещенные:
@Echo Off cls Set "BoxOut=C:\Users\Alexander\work\GENERATOR" Call :Var "C:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat" Call :Var "C:\Users\Alexander\work\GENERATOR\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BoxOut%\" &&GoTo :Begin Pause Exit /B :Out If %1=="" Exit /B 1 &If %2=="" Exit /B 1 >>"%~3%~1.bat" ( echo @Echo Off echo cls echo >nul Chcp 1251 echo Set "BoxIn=F:\%~1" echo Set "Kword=%~2" echo Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" echo Set /A M=4 echo echo Set "Mask=*.*" echo Set /A Max=2 echo echo Set /A NMax=0 echo FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( echo Set "NMax=%%~na" echo Call Set "NMax=1%%NMax:~0,%M%%%" echo ) echo echo Set /A Num=1000000 echo Set /A Num=%Num%+%NMax% echo Set /A MMax=%Max%+%Num% echo echo Set /A MMax=%Max%+%Num% echo FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( echo Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 echo ) echo Pause echo Exit /B echo echo :RenNNN echo Set /A Num+=1 echo If %Num% GTR %5 Exit /B 1 echo Call Set "NNum=%%Num:~-%4%%" echo 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN echo Exit /B 0 ) Exit /B 0 :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B Можно использовать текстовый файл (если так проще сделать), в котором будет текст, который нужно размножать (который жирным шрифтом). Т.е. в скрипте тогда будут ссылки на 3 txt файла. Один txt это код, который требуется размножать, а второй и третий txt, это данные (в них одинаковое количество строк), которые необходимо подставлять в код, который будет в первом txt. Пример: скрипт script.txt = это то, что нужно размножать. categories.txt = @@cat names.txt = @@nam брать имена файлов для создания = @@cat.bat @Echo Off cls nul Chcp 1251 Set "BoxIn=F:\@@cat" Set "Kword=@@nam" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"@@cat Set /A M=4 содержание names.txt результат выполнения: sdfhgd 65.bat @Echo Off cls nul Chcp 1251 Set "BoxIn=F:\sdfhgd 65" Set "Kword=7657557" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"sdfhgd 65 Set /A M=4 |
Отправлено: 09:58, 10-07-2019 | #4 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать на реальной задаче
Идея
@Echo Off cls >nul Chcp 1251 Set "BatOut=Z:\Users\Alexander\work\GENERATOR" Set "FilesIn=Z:\Soft_In" Call :Var "Z:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat" Call :Var "Z:\Users\Alexander\work\GENERATOR\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BatOut%\" "%FilesIn%\%%@@cat%i%%%" &&GoTo :Begin Pause Exit /B :Out If %1=="" Exit /B 1 &If %2=="" Exit /B 1 >"%~3%~1.bat" ( Echo @Echo Off Echo cls Echo ^>nul Chcp 1251 Echo Call :Procedurka %4 %2 Echo Exit /B Echo. ) FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N ":Procedurka" "%~dpnx0"`) DO ( Set /A NProc=%%a-1 >>"%~3%~1.bat" Call More +%%NProc%% "%~dpnx0" ) Exit /B 0 :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B :Procedurka Echo Здесь делаем всё что надо Echo %* Pause Exit /B 0 Реализация
@Echo Off cls Set "BatOut=Z:\Users\Alexander\work\GENERATOR" Set "FilesIn=Z:\Soft_In" Call :Var "Z:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat" Call :Var "Z:\Users\Alexander\work\GENERATOR\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BatOut%\" "%FilesIn%\%%@@cat%i%%%" &&GoTo :Begin Pause Exit /B :Out If %1=="" Exit /B 1 &If %2=="" Exit /B 1 >"%~3%~1.bat" ( Echo @Echo Off Echo cls Echo ^>nul Chcp 1251 Echo Call :Procedurka %4 %2 Echo Exit /B Echo. ) FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N ":Procedurka" "%~dpnx0"`) DO ( Set /A NProc=%%a-1 >>"%~3%~1.bat" Call More +%%NProc%% "%~dpnx0" ) Exit /B 0 :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B :Procedurka If Not Exist %1 (Echo Folder %1 not exist &Pause &Exit /B 2) Set "BoxIn=%~1" Set "Kword=%~2" rem Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" Set /A M=4 Set "Mask=*.*" Set /A Max=2 Set /A NMax=0 rem FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( Set "NMax=%%~na" rem Call Set "NMax=1%%NMax:~-%M%%%" Call Set "NMax=1%%NMax:~0,%M%%%" ) Set /A Num=1000000 Set /A Num=%Num%+%NMax% Set /A MMax=%Max%+%Num% Set /A MMax=%Max%+%Num% FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 ) Pause Exit /B :RenNNN Set /A Num+=1 If %Num% GTR %5 Exit /B 1 Call Set "NNum=%%Num:~-%4%%" rem 2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN Exit /B 0 Более экономный вариант
Делаем отдельный исполнимый файл, допустим, назовём его Procedurka.bat
:Procedurka If Not Exist %1 (Echo Folder %1 not exist &Pause &Exit /B 2) Set "BoxIn=%~1" Set "Kword=%~2" rem Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" Set /A M=4 Set "Mask=*.*" Set /A Max=2 Set /A NMax=0 rem FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( Set "NMax=%%~na" rem Call Set "NMax=1%%NMax:~-%M%%%" Call Set "NMax=1%%NMax:~0,%M%%%" ) Set /A Num=1000000 Set /A Num=%Num%+%NMax% Set /A MMax=%Max%+%Num% Set /A MMax=%Max%+%Num% FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 ) Pause Exit /B :RenNNN Set /A Num+=1 If %Num% GTR %5 Exit /B 1 Call Set "NNum=%%Num:~-%4%%" rem 2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN Exit /B 0 @Echo Off cls Set "BatOut=Z:\Users\Alexander\work\GENERATOR" Set "Proc=Z:\Users\Alexander\work\GENERATOR\Procedurka.bat" Set "FilesIn=Z:\Soft_In" Call :Var "Z:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat" Call :Var "Z:\Users\Alexander\work\GENERATOR\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BatOut%\" "%FilesIn%\%%@@cat%i%%%" "%Proc%" &&GoTo :Begin Pause Exit /B :Out If %1=="" Exit /B 1 &If %2=="" Exit /B 1 >"%~3%~1.bat" ( Echo @Echo Off Echo cls Echo ^>nul Chcp 1251 Echo Call %5 %4 %2 Echo Exit /B Echo. ) FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N ":Procedurka" "%~dpnx0"`) DO ( Set /A NProc=%%a-1 >>"%~3%~1.bat" Call More +%%NProc%% "%~dpnx0" ) Exit /B 0 :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B |
|
------- Последний раз редактировалось megaloman, 10-07-2019 в 17:00. Отправлено: 16:41, 10-07-2019 | #5 |
Ветеран Сообщения: 531
|
Профиль | Отправить PM | Цитировать Попробовал варианты, но толи я не понял как их применять, толи не правильно объяснил опять.. я не понимаю, зачем файл procedurka.bat ? Ведь, если то, что будет размножаться, находится в отдельном файле, то зачем тогда размножающийся текст казывать в теле скрипта?
Прочитал пример, вроде правильно описал. Нужен один любой вариант, либо размножающийся текст в теле скрипта, либо он в отдельном файле.. в теле скрипта, как указывал в посте выше, не работает (красный - размножающийся текст, синие кусочки будут подставляться из файлов categories.txt и names.txt): скрипт (который будем запускать) @Echo Off cls Set "BoxOut=C:\Users\Alexander\work\GENERATOR" Call :Var "C:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat" Call :Var "C:\Users\Alexander\work\GENERATOR\names.txt" "@@nam" Set /A i=1000000 :Begin Set /A i+=1 Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BoxOut%\" &&GoTo :Begin Pause Exit /B :Out If %1=="" Exit /B 1 &If %2=="" Exit /B 1 >>"%~3%~1.bat" ( echo @Echo Off echo cls echo >nul Chcp 1251 echo Set "BoxIn=F:\%~1" echo Set "Kword=%~2" echo Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" echo Set /A M=4 echo echo Set "Mask=*.*" echo Set /A Max=2 echo echo Set /A NMax=0 echo FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( echo Set "NMax=%%~na" echo Call Set "NMax=1%%NMax:~0,%M%%%" echo ) echo echo Set /A Num=1000000 echo Set /A Num=%Num%+%NMax% echo Set /A MMax=%Max%+%Num% echo echo Set /A MMax=%Max%+%Num% echo FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( echo Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 echo ) echo Pause echo Exit /B echo echo :RenNNN echo Set /A Num+=1 echo If %Num% GTR %5 Exit /B 1 echo Call Set "NNum=%%Num:~-%4%%" echo 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN echo Exit /B 0 ) Exit /B 0 :Var FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b" Exit /B файл categories.txt файл names.txt Результат выполнения скрипта (созданные файлы и их содержание, красным - подстановка из файлов categories и names) (это конечно сейчас не работает, видимо потому, что в этом тексте есть закрывающиеся скобки): ccccccccccccccc111111111.bat @Echo Off cls >nul Chcp 1251 Set "BoxIn=F:\ccccccccccccccc111111111" Set "Kword=nnnnnnnnnnn111111111" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" Set /A M=4 Set "Mask=*.*" Set /A Max=2 Set /A NMax=0 FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( Set "NMax=%%~na" Call Set "NMax=1%%NMax:~0,%M%%%" ) Set /A Num=1000000 Set /A Num=%Num%+%NMax% Set /A MMax=%Max%+%Num% Set /A MMax=%Max%+%Num% FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 ) Pause Exit /B :RenNNN Set /A Num+=1 If %Num% GTR %5 Exit /B 1 Call Set "NNum=%%Num:~-%4%%" 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN Exit /B 0 файл names.bat @Echo Off cls >nul Chcp 1251 Set "BoxIn=F:\ccccccccccccccc222222222" Set "Kword=nnnnnnnnnnn222222222" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" Set /A M=4 Set "Mask=*.*" Set /A Max=2 Set /A NMax=0 FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( Set "NMax=%%~na" Call Set "NMax=1%%NMax:~0,%M%%%" ) Set /A Num=1000000 Set /A Num=%Num%+%NMax% Set /A MMax=%Max%+%Num% Set /A MMax=%Max%+%Num% FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 ) Pause Exit /B :RenNNN Set /A Num+=1 If %Num% GTR %5 Exit /B 1 Call Set "NNum=%%Num:~-%4%%" 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN Exit /B 0 то для первого созданного файла должна всегда браться первая строчка, для второго вторая. например, размножающийся текст: результат: ccccccccccccccc111111111.bat ccccccccccccccc222222222.bat Если есть возможность указать размножающийся текст без слов "echo" слева, это хорошо, так будет удобнее, скопировал нужный скрипт и не нужно слева дописывать "echo" А второй вариант (нужен какой - то один) - размножающийся текст не в теле скрипта, а в отдельном файле txt (это пример, который я показывал в предыдущем посте): скрипт (который мы будем запускать). script.txt = это то, что нужно размножать. categories.txt = @@cat names.txt = @@nam брать имена файлов для создания = @@cat.bat содержание script.txt (то, что мы будем размножать (в предыдущем примере было красным цветом и другой текст (здесь я просто взял текст из примера предыдущего поста))) @Echo Off cls nul Chcp 1251 Set "BoxIn=F:\@@cat" Set "Kword=@@nam" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"@@cat Set /A M=4 содержание categories.txt (тоже пример из предыдущего поста) names.txt (тоже их предыдущего поста) результат выполнения (созданные файлы): sdfhgd 65.bat @Echo Off cls nul Chcp 1251 Set "BoxIn=F:\sdfhgd 65" Set "Kword=7657557" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"sdfhgd 65 Set /A M=4 |
Отправлено: 19:04, 10-07-2019 | #6 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Alexander_88, Было бы неплохо, чтобы Вы освоили тег Spoiler. Ваши пространные сообщения делают не очень комфортным просмотр сообщений в теме
По сути: либо я Вас не понимаю, либо Вы меня не услышали . Разберём скрипт более подробно из предыдущего сообщения "на реальной задаче"
Вариант "Реализация".
Set "BatOut=Z:\Users\Alexander\work\GENERATOR" Насколько я понял, в эту папку складываем сгенерированные батники. Файлы
"Z:\Users\Alexander\work\GENERATOR\categories.txt" "Z:\Users\Alexander\work\GENERATOR\names.txt" содержат: Set "FilesIn=Z:\Soft_In" Как я понял, здесь расположены папки с файлами, в частности, Z:\Soft_In\Start Содержимое папки Z:\Soft_In\Start
Позволю себе повторить код: Реализация
@Echo Off
cls
Set "BatOut=Z:\Users\Alexander\work\GENERATOR"
Set "FilesIn=Z:\Soft_In"
Call :Var "Z:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat"
Call :Var "Z:\Users\Alexander\work\GENERATOR\names.txt" "@@nam"
Set /A i=1000000
:Begin
Set /A i+=1
Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BatOut%\" "%FilesIn%\%%@@cat%i%%%" &&GoTo :Begin
Pause
Exit /B
:Out
If %1=="" Exit /B 1 &If %2=="" Exit /B 1
>"%~3%~1.bat" (
Echo @Echo Off
Echo cls
Echo ^>nul Chcp 1251
Echo Call :Procedurka %4 %2
Echo Exit /B
Echo.
)
FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N ":Procedurka" "%~dpnx0"`) DO (
Set /A NProc=%%a-1
>>"%~3%~1.bat" Call More +%%NProc%% "%~dpnx0"
)
Exit /B 0
:Var
FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b"
Exit /B
:Procedurka
If Not Exist %1 (Echo Folder %1 not exist &Pause &Exit /B 2)
Set "BoxIn=%~1"
Set "Kword=%~2"
rem Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*"
Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"
Set /A M=4
Set "Mask=*.*"
Set /A Max=2
Set /A NMax=0
rem FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
Set "NMax=%%~na"
rem Call Set "NMax=1%%NMax:~-%M%%%"
Call Set "NMax=1%%NMax:~0,%M%%%"
)
Set /A Num=1000000
Set /A Num=%Num%+%NMax%
Set /A MMax=%Max%+%Num%
Set /A MMax=%Max%+%Num%
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO (
Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
)
Pause
Exit /B
:RenNNN
Set /A Num+=1
If %Num% GTR %5 Exit /B 1
Call Set "NNum=%%Num:~-%4%%"
rem 2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN
2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN
Exit /B 0
В зелёной части :Out формируется главная часть генерируемого батника, формируется вызов :Procrdurka с полученными параметрами. В синей части к главной части пристёгивается :Procrdurka и всё, что ниже её (красный цвет). После отработки батника имеем:
Код сгенерированного start.bat
@Echo Off
cls
>nul Chcp 1251
Call :Procedurka "Z:\Soft_In\START" "start"
Exit /B
:Procedurka
If Not Exist %1 (Echo Folder %1 not exist &Pause &Exit /B 2)
Set "BoxIn=%~1"
Set "Kword=%~2"
rem Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*"
Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"
Set /A M=4
Set "Mask=*.*"
Set /A Max=2
Set /A NMax=0
rem FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
Set "NMax=%%~na"
rem Call Set "NMax=1%%NMax:~-%M%%%"
Call Set "NMax=1%%NMax:~0,%M%%%"
)
Set /A Num=1000000
Set /A Num=%Num%+%NMax%
Set /A MMax=%Max%+%Num%
Set /A MMax=%Max%+%Num%
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO (
Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
)
Pause
Exit /B
:RenNNN
Set /A Num+=1
If %Num% GTR %5 Exit /B 1
Call Set "NNum=%%Num:~-%4%%"
rem 2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN
2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN
Exit /B 0
Код сгенерированного cat2.bat
Запустим start.bat. Содержимое папки Z:\Soft_In\Start
Очевидно, во всех сгенерированных батниках подавляющая часть кода, начиная от :Procedurka, одинаковая. Резонно выделить эту часть в отдельный файл, например,
Z:\Users\Alexander\work\GENERATOR\Procedurka.bat :Procedurka If Not Exist %1 (Echo Folder %1 not exist &Pause &Exit /B 2) Set "BoxIn=%~1" Set "Kword=%~2" rem Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*" Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*" Set /A M=4 Set "Mask=*.*" Set /A Max=2 Set /A NMax=0 rem FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO ( Set "NMax=%%~na" rem Call Set "NMax=1%%NMax:~-%M%%%" Call Set "NMax=1%%NMax:~0,%M%%%" ) Set /A Num=1000000 Set /A Num=%Num%+%NMax% Set /A MMax=%Max%+%Num% Set /A MMax=%Max%+%Num% FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO ( Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1 ) Pause Exit /B :RenNNN Set /A Num+=1 If %Num% GTR %5 Exit /B 1 Call Set "NNum=%%Num:~-%4%%" rem 2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN 2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN Exit /B 0 Более экономный вариант
батники генерируются без текста :Procedurka
@Echo Off
cls
Set "BatOut=Z:\Users\Alexander\work\GENERATOR"
Set "Proc=Z:\Users\Alexander\work\GENERATOR\Procedurka.bat"
Set "FilesIn=Z:\Soft_In"
Call :Var "Z:\Users\Alexander\work\GENERATOR\categories.txt" "@@cat"
Call :Var "Z:\Users\Alexander\work\GENERATOR\names.txt" "@@nam"
Set /A i=1000000
:Begin
Set /A i+=1
Call :Out "%%@@cat%i%%%" "%%@@nam%i%%%" "%BatOut%\" "%FilesIn%\%%@@cat%i%%%" "%Proc%" &&GoTo :Begin
Pause
Exit /B
:Out
If %1=="" Exit /B 1 &If %2=="" Exit /B 1
>"%~3%~1.bat" (
Echo @Echo Off
Echo cls
Echo ^>nul Chcp 1251
Echo Call %5 %4 %2
Echo Exit /B
Echo.
)
FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N ":Procedurka" "%~dpnx0"`) DO (
Set /A NProc=%%a-1
>>"%~3%~1.bat" Call More +%%NProc%% "%~dpnx0"
)
Exit /B 0
:Var
FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /N /R /C:"^.*" %1`) DO Set /A N=1000000+%%a &Call Set "%~2%%N%%=%%b"
Exit /B
|
------- Последний раз редактировалось megaloman, 10-07-2019 в 23:29. Отправлено: 23:19, 10-07-2019 | #7 |
Ветеран Сообщения: 531
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
Цитата:
Цитата megaloman:
Цитата:
Мне кажется вы начали вникать в текст (скрипт), который нужно размножать, но он просто приведен для примера, там может быть все, что угодно, не нужно думать о том, что он делает. Цель просто его размножить.. т.е. просто его надо накопировать по нескольким файлам.. Конечно я бы сам смог накопировать множество файлов с этим текстом (скриптом), ведь я умею ctrl+C, ctrl+V нажимать Но проблема в том, что часть текста должна меняться (в каждом созданном файле, нужно менять часть текста (одно - два слова)), а также имена файлов, которые будут создаваться, должны быть разными. Для того, чтобы понять что на что будет меняться, и каким будет задаваться имя каждого созданного файла, нужны как раз файлы с нашими переменными (categories.txt, names.txt). Сейчас проблема в том, что если я пытаюсь, вставить размножающий текст (красный) в синюю область, то так не работает.. ничего не создается...... Тогда я убираю все из синей области, чтобы там ничего не было, и пытаюсь вставить размножающийся текст в красную область, туда же, где он у вас на примере. Запускаю.. файлы создаются, имена файлов все как и надо берется из переменных, в каждый файл копируется красный текст... все как и нужно, файлы нужных имен, текст размножается..., но этот самый текст везде одинаковый, т.е. в него не подставляются переменные из файлов categories и names |
|||||
Последний раз редактировалось Alexander_88, 11-07-2019 в 03:56. Отправлено: 03:48, 11-07-2019 | #8 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата Alexander_88:
Цитата Alexander_88:
Цитата Alexander_88:
VBS
Есть размножаемый текст, например "Z:\Users\Alexander\work\GENERATOR\fish.banner"
Наша продукция "^names^" имеет ^categories^. Она лучше на 123%, чем продукция конкурентов. ^names^! Оцените ^categories^!! ^names^ и офигительный ^categories^ не оставит Вас равнодушным!!! Файл "Z:\Users\Alexander\work\GENERATOR\names.txt" Файл "Z:\Users\Alexander\work\GENERATOR\categories.txt" Скрипт.vbs, размножающий рыбу и сохраняющий её в файлы с именами из names.txt и расширением от рыбы: INcategories = "Z:\Users\Alexander\work\GENERATOR\categories.txt" INnames = "Z:\Users\Alexander\work\GENERATOR\names.txt" INfish = "Z:\Users\Alexander\work\GENERATOR\fish.banner" OutDir = "Z:\Users\Alexander\work\GENERATOR" key1 = "^names^" key2 = "^categories^" Set FSO = CreateObject("Scripting.FileSystemObject") Masscat = Split(ReadFile(INcategories, FSO), vbCrLf) Massnam = Split(ReadFile(INnames, FSO), vbCrLf) N1 = LBound(Masscat) NN = UBound(Masscat) If NN <> UBound(Massnam) Then MsgBox "Files" + vbCrLf + vbCrLf + INcategories + vbCrLf + INnames + vbCrLf + vbCrLf + "contain a different number of lines" WScript.Quit 1 End If fish = ReadFile(INfish, FSO) Ext = FSO.GetExtensionName(INfish) On Error Resume Next For i = N1 To NN If Len(Trim(Massnam(i))) <> 0 Then Err.Number = 0 Set Fout = FSO.OpenTextFile(OutDir + "\" + Massnam(i) + "." + Ext, 2, True) If Err.Number <> 0 Then MsgBox "Error open file " + vbCrLf + vbCrLf + OutDir + "\" + Massnam(i) + "." + Ext + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description Fout.Close Else Fout.Write Replace(Replace(fish, key1, Massnam(i)), key2, Masscat(i)) Fout.Close End If End If Next On Error GoTo 0 ' ================================ Function ReadFile(filename, FO) On Error Resume Next Set Fin = FO.OpenTextFile(filename, 1, False) If Err.Number <> 0 Then MsgBox "Error open file " + vbCrLf + vbCrLf + filename + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description WScript.Quit 1 End If ReadFile = Fin.ReadAll Fin.Close On Error GoTo 0 End Function |
|||
------- Последний раз редактировалось megaloman, 11-07-2019 в 15:19. Отправлено: 13:44, 11-07-2019 | #9 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать а не проще:
конфиг, куда вносим изменения шаблон (с нужным уже расширением) принимающий изменения for (номера или имена) copy готовый шаблон "куда и что%%i" |
Отправлено: 13:59, 11-07-2019 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Размножить каждую строку в txt файле n количество раз | Alexander_88 | Скриптовые языки администрирования Windows | 16 | 10-07-2019 19:09 | |
CMD/BAT - [решено] размножить файл | muslimdogger | Скриптовые языки администрирования Windows | 5 | 21-08-2015 15:14 | |
CMD/BAT - Bat, который создаёт другой bat с командами на изменение текста | mazahaka2000@vk | Скриптовые языки администрирования Windows | 2 | 13-06-2015 04:52 | |
CMD/BAT - [решено] Размножить текст | Alexander_88 | Скриптовые языки администрирования Windows | 8 | 19-08-2014 10:44 | |
CMD/BAT - Как настроить последовательный запуск bat-файлов в другом bat. | codi28 | Скриптовые языки администрирования Windows | 12 | 27-11-2013 18:30 |
|