3

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

Проблема в том, что первый пакетный скрипт, который я запускаю, должен установить соединение, прежде чем я смогу запустить другие, и чтобы определить, когда это будет сделано, мне нужно посмотреть вывод первого скрипта, который я запускаю, для строки, которая указывает, что соединение установлено.

В псевдокоде,

start first script
wait for first script to output specific string
while the first script remains running:
    run several other scripts
close the first script

Эта строка появится только после печати нескольких предыдущих строк. Количество строк и время, которое это занимает, может варьироваться. Строки не выводятся все сразу. Я не могу изменить этот скрипт.

Желаемый результат таков:

C:\>first_batch_script.bat
Some line
Doing a thing
Winning the points
The Sims did this joke better
Connection established
certain string
C:\>other_batch_script.bat
other_batch_script is done!
C:\>another_batch_script.bat
another_batch_script is done!
C:\>REM kill first_batch_script.bat

Это код, который я пытаюсь:

FOR /f "tokens=* delims=" %%L IN ('first_batch_script.bat ^| find "certain string"') DO echo %%L
call other_batch_script.bat
call another_base_script.bat
REM kill first_batch_script.bat

Использование FOR /f выглядит многообещающе, но когда я запускаю этот пакетный скрипт, он запускается довольно медленно и затем зависает. В любом случае, даже если он прошел, я не вижу хорошего способа выйти из цикла и продолжить выполнение моего кода

Использование START /WAIT не помогает, потому что первый скрипт, который я запускаю, не завершается (и не должен) завершаться. Использование любого метода синхронизации просто не будет работать, потому что для установления соединения может потребоваться довольно много времени.

Итак, длинные и короткие

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

2 ответа2

1

Если я правильно понял ваше требование, то for /f не будет работать, так как ожидает завершения внутреннего процесса. Вы можете попробовать синхронизировать файл, как в этом примере:
(это будет файл зависимых скриптов, скажем, wait.bat):

@echo off

:loop
timeout /t 1
(type res.txt |find "trip")  > nul 2>&1
if errorlevel 1 goto loop
echo I can go!

запустите его в окне cmd, затем откройте второй cmd (тот же каталог) и запустите (снова, как пример):
ping localhost |find "trip" >res.txt
Вы должны увидеть 'I can go' только после того, как ping выведет 'trip' (да, вскоре он выйдет, но ваш основной сценарий / процесс не нужен)

Также обратите внимание, что обычно вы сначала запускаете свой основной скрипт! Это также гарантирует, что файл синхронизации будет очищен.

Вы не сказали, что именно вам нужно ждать - может быть, есть более простой способ проверить это? (например, используя netstat для проверки открытых соединений)?

0

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

Второй метод позволит вам управлять программой командной строки, такой как FTP.exe, и то, что вы пишете, звучит так, как будто это именно то, что вам нужно.

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

Например, input.txt:

MyUsername
qwertyPasswd
y
2
3
quit

Выше сначала введите MyUsername и нажмите Enter. Затем он напишет вторую строку и т.д.

Теперь запустите вашу программу и вставьте в нее текстовый файл:

C:\>ftp.exe <input.txt

,

Разбивка команд:

C:\>ftp.exe это пример программы, которую вы можете запустить.

<input.txt обратите внимание на символ <, он вводит содержимое input.txt и обрабатывает его как пользовательский ввод.

Обратите внимание, что если программа не ожидает ввода с клавиатуры, канал будет ожидать ее подачи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .