2

У меня есть пакетный скрипт, который запускается по расписанию, и который иногда запускается вручную. В этом сценарии есть pause поэтому echo сообщение остается видимым при запуске сценария вручную, то есть без паузы окно консоли автоматически закрывается, и пользователь не знает, почему.

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

Существует ли простой способ запуска пакетного сценария с отключенными или пропущенными паузами без изменения самого сценария? Может быть, что-то вроде myBatch.bat --skippauses?

1 ответ1

1

ПАРНЫЕ БЫСТРЫЕ СПОСОБЫ Пропустить пакетную логику из бега

НАЧАТЬ: Я не знаком ни с какими способами пропуска команд PAUSE в пакетном скрипте (по крайней мере, в вашем случае, чтобы удовлетворить ваши требования), если вы не используете одно из двух решений, которые я перечислю ниже более подробно.Я не знаю ни одного переключателя, такого как --skippauses который позволил бы достичь такого простого решения при вызове или выполнении пакетного сценария, который бы просто пропускал одну или все команды PAUSE не изменяя реальную логику пакетного сценария заранее, чтобы потенциально принять это как аргумент, чтобы НЕ делать команду PAUSE , но вы должны были бы внести изменения в логику пакетного сценария, чтобы он работал таким образом.

РЕШЕНИЕ 1 (не меняет вызываемый файл пакетного сценария, который вы вызываете)

Динамически создать новый динамически создаваемый сценарий, ПОДХОДЯЩИЙ к логике сценария CALLed, и ИСКЛЮЧИТЬ все строки, содержащие строку PAUSE (без учета регистра), а затем запустить вместо этого динамически созданный сценарий с той же логикой, что и сценарий CALLed, за вычетом всех LINES, содержащих PAUSE , и Таким образом, любые команды PAUSE .

Просто добавьте что-то похожее на ваш myBatch.bat качестве примера ниже и обязательно укажите каталоги и т.д., Где они должны быть. По сути, это будет запускать команду FINDSTR /i /v для скрипта, который вы CALL , а затем читать его построчно, но ИСКЛЮЧИТЬ все строки, содержащие строку PAUSE которая НЕ чувствительна к регистру, и направлять ее прямо к новому динамически создаваемый пакетный скрипт с уникальным именем, с которым вы затем запускаете свой CALL .

Пример сценария

@ECHO OFF

:: Parse out space from hour part of time and replace with a zero (for hours of 00:00 - 09:59)
SET hh=%TIME:~0,2%
SET hh=%hh: =0%
SET DateString=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%_%hh%%TIME:~3,2%%TIME:~6,2%
SET DynScriptName=%Temp%\NOPAUSE_%~N0_%DateString%.cmd

:: If DynScriptName already exists, just delete it
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"

:: Use FINDSTR to ignore all lines containing "pause" but pipe all other lines to DynScriptName to later CALL/EXECUTE
:: /i switch denotes case insensitivity, /v switch denotes exclude value in results piped to DynScriptName
FINDSTR /i /v "pause" "C:\folder\folder\myBatch.bat">"%DynScriptName%"

:: Call the dynamically built script without PAUSE command lines
CALL "%DynScriptName%"

:: If DynScriptName already exists, just delete it (post cleanup)
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"  
GOTO EOF

ВЫВОД: Это (Solution 1) должно удовлетворить ваши две потребности, в частности:

  1. Теперь у вас есть способ запустить динамически создаваемый сценарий без команд PAUSE основанный на запуске сценария, который динамически создает новый сценарий на основе логики сценариев [содержимого], но исключая все строки, содержащие PAUSE и тем самым исключая команды PAUSE от бега.

  2. Кроме того, это гарантирует, что текущий скрипт, который вы запускаете через CALL НЕ нужно изменять, чтобы он соответствовал запрошенным изменениям в вашем запросе, поскольку он просто динамически перестраивает другой, исключая то, что вы запрашивали.

  3. Кроме того, другое простое решение, такое как в Solution 2 (ниже), дает способ действительно вносить изменения в сценарий, который вы вызываете. Если вы хотите также рассмотреть этот простой маршрут, у вас есть мой пример Solution 2 а также другие статьи для необходимых изменений на этом уровне.


РЕШЕНИЕ 2 (изменяется логика пакетного скрипта)

В вашем скрипте с командой PAUSE вы бы добавили метку, как показано ниже, например. Затем вы добавляете метку в логику сразу после команды PAUSE чтобы вы могли добавить логику IF для поиска первого аргумента, переданного сценарию при его выполнении.

Прямо над меткой команды PAUSE ( в моем примере это означает :PauseLabel ) вы должны поместить IF [%1]==[] GOTO PauseLabel а затем следующую строку, где вы поместили GOTO SkipPause .

Это говорит о том, что если скрипт был выполнен и НЕТ первого аргумента, который передан, то перейдите к :PauseLabel и сделайте то, что есть, то есть PAUSE. Если передан ЛЮБОЙ первый аргумент, он перейдет к :SkipPause и сделает то, что будет дальше, что является остальной частью вашей логики без команды PAUSE .

Таким образом, люди могут запускать его весь день вручную, просто дважды щелкнув по нему (не передавая ему аргумент), но запланированное задание может передать любой первый аргумент, который вы хотите (это просто фиктивный аргумент), чтобы логика IF могла просто подтвердить он существует или, если это NULL.

Скрипт с командой PAUSE проверка 1-го аргумента и пример логики пропуска ниже

<Script logic before PAUSE>

IF [%1]==[] GOTO PauseLabel
GOTO SkipPause

:PauseLabel 
 PAUSE

:SkipPause
 <Rest of your batch logic>

Передача примера аргумента в ваш скрипт (где он запланирован)

myBatch.bat SkipPause

Обратите внимание, что при планировании пакета первым аргументом может быть SkipPause , dummy , DosEquis или любой другой параметр, которым вы хотите его видеть. Логика с IF просто говорит:«Есть ли аргумент, переданный скрипту, когда он был выполнен, и если так, перейдите к :SkipPause , если нет, перейдите к :PauseLabel .

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