Найти значение аргумента командной строки в командном файле - PullRequest
0 голосов
/ 09 апреля 2019

Я передаю список аргументов при запуске командного файла, и мне нужно значение определенного аргумента -logdir, чтобы установить какой-либо путь dir в моем командном файле. Как я могу сначала проверить, передан ли -logdir в качестве аргумента, и если он передан, получить его значение и установить его в переменную.

Я запускаю его как:

test.bat -env test1 -logdir C:\Users\...\log -userhome ... -log ...

и много других аргументов. Эти аргументы могут быть переданы в другом порядке.

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

set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%
set /a count=0
for /l %%x in (1, 1, %argCount%) do (
  set /a count=!count!+1
  call set "var=%%!count!"
  echo var= %!var!
)

Но я сталкиваюсь с проблемами, сравнивающими эти аргументы со значением. Я пытался использовать, если как показано ниже:

if -> if "!_var!" equ "-logdir" set /a logdir="%%!count!"

Но ошибка в синтаксисе неверна.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Вы утверждаете, что может быть "намного больше аргументов". Синтаксис %x может использовать только первые девять параметров, поэтому с доступными %1 до %9 вы можете обрабатывать только четыре пары, которых может быть слишком мало. К счастью, параметры 10 ... не потеряны (хотя и не доступны напрямую). Вы можете сдвинуть список параметров влево.

Поскольку пары параметров «могут передаваться в другом порядке», лучше всего назначать четные параметры (значения) переменным, названным как нечетные параметры (переменные). Я добавляю некоторые REM-коды в код, чтобы объяснить это:

@echo off & setlocal
:loop
if "%~2" == "" goto :done  & REM if no other pair of parameters then done
set "%~1=%~2" & REM set variable
shift & REM remove first...
shift & REM ... two params
goto :loop  & REM and repeat
:done
REM show parameters:
set -

Примечание: нет проверки синтаксиса. Ожидается, что параметры будут повторяться -param и value

Чтобы передать параметры с пробелами (или другими разделителями), заключите их в кавычки как

test.bat -env test1 -logdir "C:\path with spaces\log"
0 голосов
/ 09 апреля 2019
@echo off
setlocal

call :parseArgs %*
if errorlevel 1 exit /b 1

echo env       %env%
echo log       %log%
echo logdir    %logdir%
echo userhome  %userhome%
exit /b

:parseArgs
for %%A in (%*) do (
    if defined arg (
        call set "%%arg%%=%%~1"
        set "arg="
    ) else (
        for %%B in (
          env
          log
          logdir
          userhome
        ) do if "%%~A" == "-%%~B" set "arg=%%~B"

        if not defined arg (
            >&2 echo %%A is an invalid argument.
            exit /b 1
        )
    )
    shift
)
exit /b

После строки for %%B in ( находятся правильные ключевые слова.Если аргумент не определяет arg, то он выходит из метки :parseArgs, в которой вы можете установить errorlevel для выхода из скрипта.

Делает любой порядок с аргументами.

Например

myscript -env current -log text.log

, которая будет иметь переменную %env% со значением current и т. Д.

Если вы хотите значения по умолчанию в случае, если -log не передано, то просто, например, set "log=%~n0.log"до строки call :parseArgs.

...