Имеется папка с подпапками разного уровня вложений и файлы в них
Имеется батник (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)
мне не помогла - все равно начинают работу параллельно.
CMD/BAT - как дождать завершения одного процесса для начала другого?
-
Iska
Re: CMD/BAT - как дождать завершения одного процесса для начала другого?
Цитата ruslaw:
start.bat:
Старайтесь никогда не именовать пакетные файлы именами внутренних или внешних команд.
Цитата ruslaw:
Команда start /wait типа
start.bat:
start /wait indexer.bat
start /wait replace.bat (или: call indexer.bat)
мне не помогла - все равно начинают работу параллельно.
Код:
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 - как дождать завершения одного процесса для начала другого?
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 - как дождать завершения одного процесса для начала другого?
ruslaw,
Вот еще вариант. Объединить все файлы (батники, WSH - скрипт) в один. Единственное, я наугад (подробно о её функционале не в курсе) переписал процедуру замены подстрок из VBS в JS.
[spoiler]Код: [/spoiler]
Вот еще вариант. Объединить все файлы (батники, 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 - как дождать завершения одного процесса для начала другого?
Iska, спасибо, учту совет, Ваш скрипт вполне работает.
megaloman, тоже очень признателен, скрипт работает на отлично, но у меня он заработал когда я удалил оба chcp 866 (самому странно).
Все четко сформировал и заменил по всем позициям.
megaloman, тоже очень признателен, скрипт работает на отлично, но у меня он заработал когда я удалил оба chcp 866 (самому странно).
Все четко сформировал и заменил по всем позициям.
-
megaloman
Re: CMD/BAT - как дождать завершения одного процесса для начала другого?
ruslaw,
Цитата ruslaw:
у меня он заработал когда я удалил оба chcp 866 (самому странно).
Я всегда предполагаю, что CMD/Bat - файлы сохраняются в 866 кодировке. Похоже Вы изначально сохраняете скрипт в 1251 кодировке (например, в Notepad), поэтому, когда появляются кириллические символы, начались проблемы.
Цитата ruslaw:
Все четко сформировал и заменил по всем позициям.
Мне интересно, какой из моих скриптов, со встроенным JS ?
Цитата ruslaw:
у меня он заработал когда я удалил оба chcp 866 (самому странно).
CMD/BAT - как дождать завершения одного процесса для начала другого?
Я всегда предполагаю, что CMD/Bat - файлы сохраняются в 866 кодировке. Похоже Вы изначально сохраняете скрипт в 1251 кодировке (например, в Notepad), поэтому, когда появляются кириллические символы, начались проблемы.
Цитата ruslaw:
Все четко сформировал и заменил по всем позициям.
CMD/BAT - как дождать завершения одного процесса для начала другого?
Мне интересно, какой из моих скриптов, со встроенным JS ?
-
ruslaw
Re: CMD/BAT - как дождать завершения одного процесса для начала другого?
Оба отработали.
Первый, содержащий ссылку на мой VBS-файл, и второй, с JScript.
Первый, содержащий ссылку на мой VBS-файл, и второй, с JScript.