Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Размножить bat (http://forum.oszone.net/showthread.php?t=341261)

Alexander_88 10-07-2019 01:29 2879087

Размножить bat
 
Здравствуйте, есть код

Код:

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"


)


Iska 10-07-2019 05:43 2879096

Цитата:

Цитата Alexander_88
Вопрос.. а можно ли как - то вместить вторую переменную? »

Напрямую — нельзя, это не ЯВУ.

megaloman 10-07-2019 06:54 2879099

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


Alexander_88 10-07-2019 09:58 2879113

спасибо, проверил, работает, только на реальной задаче не работает (только на примере), видимо какие - то символы запрещенные:

Код:

@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


megaloman 10-07-2019 16:41 2879189

на реальной задаче
Идея
Код:

@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


Alexander_88 10-07-2019 19:04 2879219

Попробовал варианты, но толи я не понял как их применять, толи не правильно объяснил опять.. я не понимаю, зачем файл 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


megaloman 10-07-2019 23:19 2879273

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 такой же, как и в предыдущем варианте


Alexander_88 11-07-2019 03:48 2879292

Цитата:

Цитата 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 »

Вот тут я не понял, для чего этот путь указывать, откуда там взялись эти файлы и зачем они вообще нужны? :dont-know

Цитата:

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

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

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

megaloman 11-07-2019 13:44 2879364

Цитата:

Цитата 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%, чем продукция конкурентов.
Офигительная хрень! Оцените  потрясающий вкус и омерзительный вид!!
Офигительная хрень и офигительный потрясающий вкус и омерзительный вид не оставит Вас равнодушным!!!


alpap 11-07-2019 13:59 2879368

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

Alexander_88 11-07-2019 16:53 2879411

Спасибо, сейчас все, как хотел работает, изменил немного, имена берутся из categories, а расширение всегда ".bat". Вроде ничего не испортил... скрипт, который размножил, попробовал запустить, тоже работает. :)

Скрытый текст
Код:

INcategories = "C:\Users\Alexander\work\GENERATOR\categories.txt"
INnames = "C:\Users\Alexander\work\GENERATOR\names.txt"
INfish = "C:\Users\Alexander\work\GENERATOR\in.txt"
OutDir = "C:\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 + "\" + Masscat(i) + ".bat", 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 17:19 2879416

Alexander_88, Моя знакомая говАривала: я с Вас валяюсь! :)
Цитата:

Цитата Alexander_88
расширение всегда ".bat". »

Тогда и INfish = "C:\Users\Alexander\work\GENERATOR\in.txtbat"
Не знаю, что за батник, но
Цитата:

Цитата megaloman
Если Вы хотите размножать текст батника, меняя в коде какие-то слова - это тупиковый для СMD путь. В этом случае я предложил вам оформить батник в виде процедуры (причём это можно сделать и в отдельном файле, и нужные данные передавать в вызываемом батнике в параметрах) »

Я Вам делал эту задачу, и батник у меня прекрасно размножался - только не надо в коде что-то менять, передавайте в него параметры.
Цитата:

Цитата Alexander_88
Вроде ничего не испортил... скрипт, который размножил, попробовал запустить, тоже работает. »

Цитата:

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

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

Alexander_88 11-07-2019 19:11 2879432

Цитата:

Цитата megaloman
Тогда и INfish = "C:\Users\Alexander\work\GENERATOR\in.txtbat" »

in.txt давно у меня, в него часто записывается нужный текст и не один скрипт с этим файлом работает, его имя и расширение нельзя менять, я в него просто текст батника вставляю, а скрипт уже размножает с именами *.bat :)


Время: 14:24.

Время: 14:24.
© OSzone.net 2001-