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

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

Ответить
Настройки темы
CMD/BAT - [решено] Размножить bat

Ветеран


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

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


Здравствуйте, есть код

Код: Выделить весь код
for /f "delims=" %%i in (categories.txt) do (



echo setlocal %%i >>"%%i.bat"
echo setlocal enableextensions %%i >>"%%i.bat"


)
Он создает нужный текст, подставляет переменные из текстового файла и создает файлы с именами, перечисленными в текстовом файле..
Вопрос.. а можно ли как - то вместить вторую переменную? Я хочу ее вставить в текст, она также должна заменяться на то, что в другом txt файле..


Примерно вот так (конечно это работать не будет):

Код: Выделить весь код
for /f "delims=" %%i in (categories.txt), %%k (names.txt) do (



echo setlocal %%i >>"%%i.bat"
echo setlocal enableextensions %%k >>"%%i.bat"


)

Отправлено: 01:29, 10-07-2019

 

Ветеран


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

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


Цитата Alexander_88:
Вопрос.. а можно ли как - то вместить вторую переменную? »
Напрямую — нельзя, это не ЯВУ.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:43, 10-07-2019 | #2



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

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


Ветеран


Contributor


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

Профиль | Отправить 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
Благодарности: 4

Профиль | Отправить 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
Сразу вопрос, можно ли избавится от надписи echo в скрипте (слева, в выделенном жирным шрифтом тексте) ? Для удобства, чтобы просто вставил нужный код и все.
Можно использовать текстовый файл (если так проще сделать), в котором будет текст, который нужно размножать (который жирным шрифтом). Т.е. в скрипте тогда будут ссылки на 3 txt файла. Один txt это код, который требуется размножать, а второй и третий txt, это данные (в них одинаковое количество строк), которые необходимо подставлять в код, который будет в первом 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
Код: Выделить весь код
sdfhgd 65
kakjdfd12
содержание names.txt
Код: Выделить весь код
7657557
qkjkjfjqf
результат выполнения:

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
kakjdfd12.bat
Код: Выделить весь код
@Echo Off
cls
nul Chcp 1251

Set "BoxIn=F:\kakjdfd12"
Set "Kword=qkjkjfjqf"
Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"kakjdfd12
Set /A M=4

Отправлено: 09:58, 10-07-2019 | #4


Ветеран


Contributor


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

Профиль | Отправить 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
Далее сделаем батник - генератор батников для вызова Procedurka.bat с нужными аргументами
Код: Выделить весь код
@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
Результат его работы (для одного из сгенерированных батников)
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Call "Z:\Users\Alexander\work\GENERATOR\Procedurka.bat" "Z:\Soft_In\START" "start"
Exit /B

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


Последний раз редактировалось megaloman, 10-07-2019 в 17:00.

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

Отправлено: 16:41, 10-07-2019 | #5


Ветеран


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

Профиль | Отправить 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
Код: Выделить весь код
ccccccccccccccc111111111
ccccccccccccccc222222222
файл names.txt
Код: Выделить весь код
nnnnnnnnnnn111111111
nnnnnnnnnnn222222222
Результат выполнения скрипта (созданные файлы и их содержание, красным - подстановка из файлов 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
Если указано несколько переменных (например %~1)
то для первого созданного файла должна всегда браться первая строчка, для второго вторая.

например, размножающийся текст:
Код: Выделить весь код
sadsad %~1 %~1
%~2
результат:
ccccccccccccccc111111111.bat
Код: Выделить весь код
sadsad ccccccccccccccc111111111 ccccccccccccccc111111111
nnnnnnnnnnn111111111
ccccccccccccccc222222222.bat
Код: Выделить весь код
sadsad ccccccccccccccc222222222 ccccccccccccccc222222222
nnnnnnnnnnn222222222
Если есть возможность указать размножающийся текст без слов "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 (тоже пример из предыдущего поста)
Код: Выделить весь код
sdfhgd 65
kakjdfd12

names.txt (тоже их предыдущего поста)
Код: Выделить весь код
7657557
qkjkjfjqf

результат выполнения (созданные файлы):

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
kakjdfd12.bat
Код: Выделить весь код
@Echo Off
cls
nul Chcp 1251

Set "BoxIn=F:\kakjdfd12"
Set "Kword=qkjkjfjqf"
Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"kakjdfd12
Set /A M=4

Отправлено: 19:04, 10-07-2019 | #6


Ветеран


Contributor


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

Профиль | Отправить 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"
содержат:
categories.txt
Код: Выделить весь код
START
cat2
cat3
cat4
cat5
cat6
cat7
names.txt
Код: Выделить весь код
start
name2
name3
name4
name5
name6
name7
Папка
Set "FilesIn=Z:\Soft_In"
Как я понял, здесь расположены папки с файлами, в частности, Z:\Soft_In\Start
Содержимое папки Z:\Soft_In\Start
Код: Выделить весь код
0041start.mp4
0056start.mp4
0057start.avi
0058start.wmw
00uyjkskh.wmv
jsfdhgsjkd.avi
start0040.mp4
start0041.mp4
start0048.mp4
start0049.mp4
start0056.mp4
start0057.avi
start0058.wmw
start0059.wmw
ziyxvyz.mpg
Позволю себе повторить код: Реализация
Код: Выделить весь код
@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
В верхнем "главном" модуле считываются переменные из файлов categories.txt names.txt и с ними вызывается процедура :Out формирования батников для каждой пары параметров в указанной папке.
В зелёной части :Out формируется главная часть генерируемого батника, формируется вызов :Procrdurka с полученными параметрами.
В синей части к главной части пристёгивается :Procrdurka и всё, что ниже её (красный цвет).
После отработки батника имеем:
До запуска батника в папке BatOut=Z:\Users\Alexander\work\GENERATOR имеются файлы
Код: Выделить весь код
categories.txt
names.txt
Батник отработал, красным цветом выделены сгенерированные батники:
Код: Выделить весь код
cat2.bat
cat3.bat
cat4.bat
cat5.bat
cat6.bat
cat7.bat
categories.txt
names.txt
START.bat
Код сгенерированного 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
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Call :Procedurka "Z:\Soft_In\cat2" "name2"
Exit /B


:Procedurka
....................
....................
....................
Exit /B 0

Запустим start.bat.
Содержимое папки Z:\Soft_In\Start
Код: Выделить весь код
0041start.mp4
0056start.mp4
0057start.avi
0058start.wmw
0059start.wmv
0060start.avi
start0040.mp4
start0041.mp4
start0048.mp4
start0049.mp4
start0056.mp4
start0057.avi
start0058.wmw
start0059.wmw
ziyxvyz.mpg
ИМХО, я добился того, что Вы хотели.
Очевидно, во всех сгенерированных батниках подавляющая часть кода, начиная от :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
сгенерированный при этом файл start.bat
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Call "Z:\Users\Alexander\work\GENERATOR\Procedurka.bat" "Z:\Soft_In\START" "start"
Exit /B
Результат запуска start.bat такой же, как и в предыдущем варианте

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


Последний раз редактировалось megaloman, 10-07-2019 в 23:29.

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

Отправлено: 23:19, 10-07-2019 | #7


Ветеран


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

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


Цитата megaloman:
По сути: либо я Вас не понимаю, либо Вы меня не услышали »
Да, что - то я действительно не пойму

Цитата megaloman:
Set "BatOut=Z:\Users\Alexander\work\GENERATOR"
Насколько я понял, в эту папку складываем сгенерированные батники. »
Это да

Цитата:
Файлы
"Z:\Users\Alexander\work\GENERATOR\categories.txt"
"Z:\Users\Alexander\work\GENERATOR\names.txt"
содержат:
Это да, тут файлы с переменными, которые мы будем подставлять в размножающийся текст.


Цитата megaloman:
Папка
Set "FilesIn=Z:\Soft_In"
Как я понял, здесь расположены папки с файлами, в частности, Z:\Soft_In\Start »
Вот тут я не понял, для чего этот путь указывать, откуда там взялись эти файлы и зачем они вообще нужны?

Цитата:
Запустим start.bat.
А зачем это делать? Для чего?

Мне кажется вы начали вникать в текст (скрипт), который нужно размножать, но он просто приведен для примера, там может быть все, что угодно, не нужно думать о том, что он делает. Цель просто его размножить.. т.е. просто его надо накопировать по нескольким файлам.. Конечно я бы сам смог накопировать множество файлов с этим текстом (скриптом), ведь я умею ctrl+C, ctrl+V нажимать Но проблема в том, что часть текста должна меняться (в каждом созданном файле, нужно менять часть текста (одно - два слова)), а также имена файлов, которые будут создаваться, должны быть разными. Для того, чтобы понять что на что будет меняться, и каким будет задаваться имя каждого созданного файла, нужны как раз файлы с нашими переменными (categories.txt, names.txt).

Сейчас проблема в том, что если я пытаюсь, вставить размножающий текст (красный) в синюю область, то так не работает.. ничего не создается...... Тогда я убираю все из синей области, чтобы там ничего не было, и пытаюсь вставить размножающийся текст в красную область, туда же, где он у вас на примере. Запускаю.. файлы создаются, имена файлов все как и надо берется из переменных, в каждый файл копируется красный текст... все как и нужно, файлы нужных имен, текст размножается..., но этот самый текст везде одинаковый, т.е. в него не подставляются переменные из файлов categories и names

Последний раз редактировалось Alexander_88, 11-07-2019 в 03:56.


Отправлено: 03:48, 11-07-2019 | #8


Ветеран


Contributor


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

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


Цитата Alexander_88:
спасибо, проверил, работает, только на реальной задаче не работает (только на примере), видимо какие - то символы запрещенные »
Цитата Alexander_88:
Мне кажется вы начали вникать в текст (скрипт), который нужно размножать, но он просто приведен для примера, там может быть все, что угодно, не нужно думать о том, что он делает. Цель просто его размножить.. »
Если Вы хотите размножать текст батника, меняя в коде какие-то слова - это тупиковый для СMD путь. В этом случае я предложил вам оформить батник в виде процедуры (причём это можно сделать и в отдельном файле, и нужные данные передавать в вызываемом батнике в параметрах -
Цитата Alexander_88:
Вот тут я не понял, для чего этот путь указывать, откуда там взялись эти файлы и зачем они вообще нужны?
Цитата:
Запустим start.bat.
А зачем это делать? Для чего? »
конкретный пример с конкретным батником решающим конкретную задачу из вашей соседней темы я привёл, коль Вы сослались на этот батник в Вашем примере. А раз Вы размножаете текст " там может быть все, что угодно" то для CMD это не всегда возможно: " какие - то символы запрещенные".
VBS
Есть размножаемый текст, например "Z:\Users\Alexander\work\GENERATOR\fish.banner"
Код: Выделить весь код
Наша продукция "^names^" имеет ^categories^.
Она лучше на 123%, чем продукция конкурентов.
^names^! Оцените  ^categories^!!
^names^ и офигительный ^categories^ не оставит Вас равнодушным!!!
В котором в нужных местах стоят ключевые слова, которые будут заменяться при размножении
Файл "Z:\Users\Alexander\work\GENERATOR\names.txt"
Код: Выделить весь код
Офигительная хрень
Обалденная фигня
start
name2
name3
name4
name5
name6
name7
Файл "Z:\Users\Alexander\work\GENERATOR\categories.txt"
Код: Выделить весь код
потрясающий вкус и омерзительный вид
jjjjj
START
cat2
cat3
cat4
cat5
cat6
cat7
Скрипт.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
Среди прочих, полученный файл "Офигительная хрень.banner" имеет содержимое
Код: Выделить весь код
Наша продукция "Офигительная хрень" имеет потрясающий вкус и омерзительный вид.
Она лучше на 123%, чем продукция конкурентов.
Офигительная хрень! Оцените  потрясающий вкус и омерзительный вид!!
Офигительная хрень и офигительный потрясающий вкус и омерзительный вид не оставит Вас равнодушным!!!

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


Последний раз редактировалось megaloman, 11-07-2019 в 15:19.

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

Отправлено: 13:44, 11-07-2019 | #9


Ветеран


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

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


а не проще:
конфиг, куда вносим изменения
шаблон (с нужным уже расширением) принимающий изменения
for (номера или имена) copy готовый шаблон "куда и что%%i"
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:59, 11-07-2019 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход