Войти

Показать полную графическую версию : как дождать завершения одного процесса для начала другого?


ruslaw
15-01-2018, 13:56
Имеется папка с подпапками разного уровня вложений и файлы в них
Имеется батник (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
15-01-2018, 14:19
start.bat: »
Старайтесь никогда не именовать пакетные файлы именами внутренних или внешних команд.

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

megaloman
15-01-2018, 14:31
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
15-01-2018, 16:30
ruslaw, @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
16-01-2018, 12:54
Iska, спасибо, учту совет, Ваш скрипт вполне работает.
megaloman, тоже очень признателен, скрипт работает на отлично, но у меня он заработал когда я удалил оба chcp 866 (самому странно).
Все четко сформировал и заменил по всем позициям.

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

ruslaw
17-01-2018, 12:00
Оба отработали.
Первый, содержащий ссылку на мой VBS-файл, и второй, с JScript.




© OSzone.net 2001-2012