ПАРНЫЕ БЫСТРЫЕ СПОСОБЫ Пропустить пакетную логику из бега
НАЧАТЬ: Я не знаком ни с какими способами пропуска команд 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
) должно удовлетворить ваши две потребности, в частности:
Теперь у вас есть способ запустить динамически создаваемый сценарий без команд PAUSE
основанный на запуске сценария, который динамически создает новый сценарий на основе логики сценариев [содержимого], но исключая все строки, содержащие PAUSE
и тем самым исключая команды PAUSE
от бега.
Кроме того, это гарантирует, что текущий скрипт, который вы запускаете через CALL
НЕ нужно изменять, чтобы он соответствовал запрошенным изменениям в вашем запросе, поскольку он просто динамически перестраивает другой, исключая то, что вы запрашивали.
Кроме того, другое простое решение, такое как в 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
.