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

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

ruslaw 15-01-2018 13:56 2791514

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

Цитата:

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


megaloman 15-01-2018 14:31 2791530

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 2791561

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();


ruslaw 16-01-2018 12:54 2791769

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

megaloman 16-01-2018 13:30 2791780

ruslaw,
Цитата:

Цитата ruslaw
у меня он заработал когда я удалил оба chcp 866 (самому странно). »

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

Цитата ruslaw
Все четко сформировал и заменил по всем позициям. »

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

ruslaw 17-01-2018 12:00 2792004

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


Время: 11:52.

Время: 11:52.
© OSzone.net 2001-