CMD/BAT - как дождать завершения одного процесса для начала другого?

Ответить
Аватара пользователя
ruslaw

CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение ruslaw »

Имеется папка с подпапками разного уровня вложений и файлы в них

Имеется батник (indexer.bat), который помещает в каждую папку список имен содержащихся в них файлов (index.txt):

indexer.bat


Цитата:



@Echo Off

chcp 1251

Set "BoxIn=E:\test"

Set "LogExt=txt"

Call :DirTxt "%BoxIn%"

For /F "usebackq delims=" %%d In (`Dir "%BoxIn%" /b /A:D /S 2^>nul`) DO Call :DirTxt "%%d"

GoTo :Eof

:DirTxt

rem:: заменяем %~nx1 на 1ndex и получаем индексный файл с названием index.html вместо html-файла названного именем папки

Set "OutLog=index.%LogExt%"

>"%~1\%OutLog%" (For /F "usebackq delims=" %%f In (`Dir "%~1" /b /A:-D-H 2^>nul`) DO If /I Not "%%f"=="%OutLog%" @Echo %%f

GoTo :Eof



По завершении работы этого батника необходимо запустить другой батник (replace.bat), который осуществляет замену текста в части этих index.txt (имеющихся в каждой папке)

replace.bat:


Цитата:



cscript replace.vbs "E:\path-1\index.txt" "заменяемый текст1" "заменяющий текст1"

.........

cscript replace.vbs "E:\path-N\index.txt" "заменяемый текстN" "заменяющий текстN"



replace.vbs - готовый скрипт, не имеющий отношения к данному вопросу.



Как сделать так, чтобы replace.bat запускался только после того как indexer.bat завершит свою работу, а не начинал работать параллельно, рискуя пропустить те index.txt которые еще не успели создаться.

Команда start /wait типа

start.bat:

start /wait indexer.bat

start /wait replace.bat (или: call indexer.bat)

мне не помогла - все равно начинают работу параллельно.
Аватара пользователя
Iska

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение Iska »

Цитата ruslaw:



start.bat:
CMD/BAT - как дождать завершения одного процесса для начала другого?




Старайтесь никогда не именовать пакетные файлы именами внутренних или внешних команд.




Цитата ruslaw:



Команда start /wait типа

start.bat:

start /wait indexer.bat

start /wait replace.bat (или: call indexer.bat)

мне не помогла - все равно начинают работу параллельно.
CMD/BAT - как дождать завершения одного процесса для начала другого?






Код:

Код: Выделить всё

call indexer.bat
call replace.bat
Аватара пользователя
megaloman

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение megaloman »

ruslaw,Чтобы не плодить кучу батников, я бы использовал подпрограммы, например

Код:

Код: Выделить всё

@Echo Off
Call :Indexer
Call :Replace
GoTo :Eof
:Indexer
	chcp 1251
 	Set "BoxIn=E:\test"
 	Set "LogExt=txt"
 	Call :DirTxt "%BoxIn%" 
 	For /F "usebackq delims=" %%d In (`Dir "%BoxIn%" /b /A:D /S 2^>nul`) DO Call :DirTxt "%%d"
	chcp 866
 	GoTo :Eof
 	:DirTxt
 	rem:: заменяем %~nx1 на 1ndex и получаем индексный файл с названием index.html вместо html-файла названного именем папки
	Set "OutLog=index.%LogExt%"
 	>"%~1\%OutLog%" (For /F "usebackq delims=" %%f In (`Dir "%~1" /b /A:-D-H 2^>nul`) DO If /I Not "%%f"=="%OutLog%" @Echo %%f
	chcp 866
GoTo :Eof
:Replace
	cscript replace.vbs "E:\path-1\index.txt" "заменяемый текст1" "заменяющий текст1"
 	rem .........
 	cscript replace.vbs "E:\path-N\index.txt" "заменяемый текстN" "заменяющий текстN" 
GoTo :Eof

Я не вчитывался в Ваши батники, я их использовал как иллюстрацию возможной структуры скрипта
Аватара пользователя
megaloman

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение megaloman »

ruslaw,


Вот еще вариант. Объединить все файлы (батники, WSH - скрипт) в один. Единственное, я наугад (подробно о её функционале не в курсе) переписал процедуру замены подстрок из VBS в JS.

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@set @E=1; /*
@Echo Off
cls
Call :Indexer
Call :Replace
pause
GoTo :Eof
:Indexer
	chcp 1251
 	Set "BoxIn=E:\test"
 	Set "LogExt=txt"
 	Call :DirTxt "%BoxIn%" 
 	For /F "usebackq delims=" %%d In (`Dir "%BoxIn%" /b /A:D /S 2^>nul`) DO Call :DirTxt "%%d"
	chcp 866
 	GoTo :Eof
 	:DirTxt
 	rem:: заменяем %~nx1 на 1ndex и получаем индексный файл с названием index.html вместо html-файла названного именем папки
	Set "OutLog=index.%LogExt%"
 	>"%~1\%OutLog%" (For /F "usebackq delims=" %%f In (`Dir "%~1" /b /A:-D-H 2^>nul`) DO If /I Not "%%f"=="%OutLog%" @Echo %%f
	chcp 866
GoTo :Eof
:Replace
	Cscript //NoLogo /E:jscript "%~dpnx0" "E:\path-1\index.txt" "заменяемый текст1" "заменяющий текст1"
	rem .............................
	Cscript //NoLogo /E:jscript "%~dpnx0" "E:\path-N\index.txt" "заменяемый текстN" "заменяющий текстN"
GoTo :Eof
*/
var oArg = WScript.Arguments;
if (oArg.Count() != 3) {
	WScript.Echo("Error! Invalid number of arguments!");
	WScript.Quit(240);
}
var FText=oArg(0);
var str1=oArg(1);
var str2=oArg(2);
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
var InFile;
try {InFile = FSO.OpenTextFile(FText,1);}
catch (e) {
   if (e !=0 ) {
	WScript.Echo("Error! " + FText + "  " + e.description);
       	WScript.Quit(240);
     }
}
var TextAll = InFile.ReadAll();
InFile.Close();
TextAll=TextAll.replace(new RegExp(oArg(1),'g'),oArg(2));
InFile = FSO.OpenTextFile(FText,2);
InFile.Write(TextAll);
InFile.Close();
Аватара пользователя
ruslaw

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение ruslaw »

Iska, спасибо, учту совет, Ваш скрипт вполне работает.

megaloman, тоже очень признателен, скрипт работает на отлично, но у меня он заработал когда я удалил оба chcp 866 (самому странно).

Все четко сформировал и заменил по всем позициям.
Аватара пользователя
megaloman

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение megaloman »

ruslaw,
Цитата ruslaw:



у меня он заработал когда я удалил оба chcp 866 (самому странно).
CMD/BAT - как дождать завершения одного процесса для начала другого?




Я всегда предполагаю, что CMD/Bat - файлы сохраняются в 866 кодировке. Похоже Вы изначально сохраняете скрипт в 1251 кодировке (например, в Notepad), поэтому, когда появляются кириллические символы, начались проблемы.
Цитата ruslaw:



Все четко сформировал и заменил по всем позициям.
CMD/BAT - как дождать завершения одного процесса для начала другого?




Мне интересно, какой из моих скриптов, со встроенным JS ?
Аватара пользователя
ruslaw

Re: CMD/BAT - как дождать завершения одного процесса для начала другого?

Сообщение ruslaw »

Оба отработали.

Первый, содержащий ссылку на мой VBS-файл, и второй, с JScript.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»