Это более лаконичная версия ответа Джебса.
Он использует ту же технику goto, но вместо передачи уникального параметра "START" при повторном вводе он проверяет, является ли первый символ первогоПараметр ":" использует извлечение подстроки и вызывает goto только если это метка.Это упрощает вызов, однако вы не можете использовать извлечение подстроки с переменными% 1 или пустыми / несуществующими переменными, поэтому необходимо использовать временную переменную, которая всегда содержит значение.В любом случае ему требуется временная переменная, чтобы запомнить метку, так как SHIFT /1
удалит параметр first: LABEL, но он должен использовать SHIFT только один раз и не требует дополнительного параметра на сайте вызова.
[ update: должен выполнить shift /1
, чтобы избежать изменения% 0 в случае, если он используется сценарием]
set "LABEL=%~1_"
if "%LABEL:~0,1%"==":" SHIFT /1 & goto %LABEL:~0,-1%
Итак, следующий скрипт показывает, как вы можетеиспользуйте параметры, переданные в исходный скрипт, а также повторно введите метки процесса:
@echo off
set "LABEL=%~1_"
if "%LABEL:~0,1%"==":" SHIFT /1 & goto %LABEL:~0,-1%
call "%~f0" :LABEL_TEST param1 p2 | findstr foo
echo param 1 is %1
exit /b
:LABEL_TEST
echo (foo) called label with PARAMS: %1 %2 %3
echo (bar) called label with PARAMS: %1 %2 %3
exit /b
выведет:
C:\>call-test-with-params TEST
(foo) called label with PARAMS: param1 p2
param 1 is TEST
строка echo (bar)
, удаляемая каналомнайти
решение вопроса:
Этот скрипт:
@echo off
set "LABEL=%~1_"
if "%LABEL:~0,1%"==":" SHIFT /1 & goto %LABEL:~0,-1%
@rem call-test.cmd
@rem _________________________________________________
@rem Test :label call option for .cmd files.
@rem
@echo ^ [start]
@call "%~f0" :Label-03 p1
@call "%~f0" :Label-02 second | find " "
@call "%~f0" :Label-02 second | tee call-test.log
@goto Done
@rem _________________________________________________
:Label-01
@echo ^ label 01 :: %1
@goto Exit
@rem _________________________________________________
:Label-02
@echo ^ label 02 :: %1
@goto Exit
@rem _________________________________________________
:Label-03
@echo ^ label 03 :: %1
@goto Exit
@rem _________________________________________________
:Done
@echo ^ [done]
@pause
@rem _________________________________________________
:Exit
@exit /b
будет отображаться:
C:\>call-test
[start]
label 03 :: p1
label 02 :: second
label 02 :: second
[done]
Press any key to continue . . .
И call-test.log
имеет правильное содержание:
C:\>more call-test.log
label 02 :: second