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

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

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

Пользователь


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

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


Имеется папка с подпапками разного уровня вложений и файлы в них
Имеется батник (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)
мне не помогла - все равно начинают работу параллельно.

Отправлено: 13:56, 15-01-2018

 

Ветеран


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

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


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

Цитата ruslaw:
Команда start /wait типа
start.bat:
start /wait indexer.bat
start /wait replace.bat (или: call indexer.bat)
мне не помогла - все равно начинают работу параллельно. »
Код: Выделить весь код
call indexer.bat
call replace.bat
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:19, 15-01-2018 | #2



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

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


Ветеран


Contributor


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

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


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
Я не вчитывался в Ваши батники, я их использовал как иллюстрацию возможной структуры скрипта

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

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

Отправлено: 14:31, 15-01-2018 | #3


Ветеран


Contributor


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

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


ruslaw,
Вот еще вариант. Объединить все файлы (батники, WSH - скрипт) в один. Единственное, я наугад (подробно о её функционале не в курсе) переписал процедуру замены подстрок из VBS в JS.
Код: Выделить весь код
@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();

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


Последний раз редактировалось megaloman, 15-01-2018 в 19:00.


Отправлено: 16:30, 15-01-2018 | #4


Пользователь


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

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


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

Отправлено: 12:54, 16-01-2018 | #5


Ветеран


Contributor


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

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


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

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


Отправлено: 13:30, 16-01-2018 | #6


Пользователь


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

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


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

Отправлено: 12:00, 17-01-2018 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Завершение одного процесса и запуск другого с помощью bat-файла irbis85 Скриптовые языки администрирования Windows 7 26-05-2015 19:19
2003/XP/2000 - Как перенести письма Outlook с одного компа,в bat другого. bornflyy Microsoft Office (Word, Excel, Outlook и т.д.) 1 17-07-2012 17:47
Почта - Как перенести письма Outlook с одного компа,в bat другого. bornflyy Программное обеспечение Windows 0 17-07-2012 12:48
.NET - Ожидание завершения процесса Efsey Программирование и базы данных 11 24-11-2010 19:16
C++ Builder->Определение времени, необходимого для завершения процесса XCodeR Программирование и базы данных 6 18-01-2005 14:40




 
Переход