Как передать параметры командной строки в пакетный файл?

Мне нужно передать id и пароль в файл cmd (или bat) во время работы, а не жестко кодировать их в файл.

Вот как выглядит командная строка:

 test.cmd admin P@55w0rd > test-log.txt
 
вопрос задан 25.08.2008
Keng
30321 репутация

15 ответов


  • 0 рейтинг

    Простое решение (даже если вопрос старый)

    Test1.bat

     echo off
    echo "Batch started"
    set arg1=%1
    echo "arg1 is %arg1%"
    echo on
    pause
     

    CallTest1.bat

     call "C:\Temp\Test1.bat" pass123
     

    выход

     YourLocalPath>call "C:\Temp\test.bat" pass123
    
    YourLocalPath>echo off
    "Batch started"
    "arg1 is pass123"
    
    YourLocalPath>pause
    Press any key to continue . . .
     

    Где YourLocalPath - текущий путь к каталогу.

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

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

    Чтобы написать код в строке: см. Другие ответы.

    ответ дан Amol Ramkrishna Patil, с репутацией 76, 3.07.2018
  • 0 рейтинг
     FOR %%A IN (%*) DO (
        REM Now your batch file handles %%A instead of %1
        REM No need to use SHIFT anymore.
        ECHO %%A
    )
     

    Это зацикливается на параметры партии (% *), либо они цитируются, либо нет, а затем эхо каждого параметра.

    ответ дан Amr Ali, с репутацией 485, 25.11.2014
  • 0 рейтинг

    Еще один полезный совет - использовать %* для обозначения «все». Например:

     echo off
    set arg1=%1
    set arg2=%2
    shift
    shift
    fake-command /u %arg1% /p %arg2% %*
     

    Когда вы запускаете:

     test-command admin password foo bar
     

    будет запущен предыдущий командный файл:

     fake-command /u admin /p password foo bar
     

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

    ответ дан Greg Hewgill, с репутацией 645957, 25.08.2008
  • 0 рейтинг

    Чтобы ссылаться на заданную переменную в командной строке, вам нужно будет использовать «% a%», например, например:

           set a=100 
          echo %a%  
          output = 100 
     

    Примечание. Это работает для Windows 7 pro.

    ответ дан CMS_95, с репутацией 158, 14.11.2013
  • 0 рейтинг

    Если вы хотите разумно обрабатывать отсутствующие параметры, вы можете сделать что-то вроде:

     IF %1.==. GOTO No1
    IF %2.==. GOTO No2
    ... do stuff...
    GOTO End1
    
    :No1
      ECHO No param 1
    GOTO End1
    :No2
      ECHO No param 2
    GOTO End1
    
    :End1
     
    ответ дан thelsdj, с репутацией 5854, 25.08.2008
  • 0 рейтинг

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

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

     >template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]
     

    Суть его состоит в :init , :parse и :main функциях.

    Пример использования

     >template.bat /?
    test v1.23
    This is a sample batch file template,
    providing command-line arguments and flags.
    
    USAGE:
    test.bat [flags] "required argument" "optional argument"
    
    /?, --help           shows this help
    /v, --version        shows the version
    /e, --verbose        shows detailed output
    -f, --flag value     specifies a named parameter value
    
    >template.bat          <- throws missing argument error
    (same as /?, plus..)
    ****                                   ****
    ****    MISSING "REQUIRED ARGUMENT"    ****
    ****                                   ****
    
    >template.bat -v
    1.23
    
    >template.bat --version
    test v1.23
    This is a sample batch file template,
    providing command-line arguments and flags.
    
    >template.bat -e arg1
    **** DEBUG IS ON
    UnNamedArgument:    "arg1"
    UnNamedOptionalArg: not provided
    NamedFlag:          not provided
    
    >template.bat --flag "my flag" arg1 arg2
    UnNamedArgument:    "arg1"
    UnNamedOptionalArg: "arg2"
    NamedFlag:          "my flag"
    
    >template.bat --verbose "argument #1" --flag "my flag" second
    **** DEBUG IS ON
    UnNamedArgument:    "argument #1"
    UnNamedOptionalArg: "second"
    NamedFlag:          "my flag"
     

    template.bat

     @::!/dos/rocks
    @echo off
    goto :init
    
    :header
        echo %__NAME% v%__VERSION%
        echo This is a sample batch file template,
        echo providing command-line arguments and flags.
        echo.
        goto :eof
    
    :usage
        echo USAGE:
        echo   %__BAT_NAME% [flags] "required argument" "optional argument" 
        echo.
        echo.  /?, --help           shows this help
        echo.  /v, --version        shows the version
        echo.  /e, --verbose        shows detailed output
        echo.  -f, --flag value     specifies a named parameter value
        goto :eof
    
    :version
        if "%~1"=="full" call :header & goto :eof
        echo %__VERSION%
        goto :eof
    
    :missing_argument
        call :header
        call :usage
        echo.
        echo ****                                   ****
        echo ****    MISSING "REQUIRED ARGUMENT"    ****
        echo ****                                   ****
        echo.
        goto :eof
    
    :init
        set "__NAME=%~n0"
        set "__VERSION=1.23"
        set "__YEAR=2017"
    
        set "__BAT_FILE=%~0"
        set "__BAT_PATH=%~dp0"
        set "__BAT_NAME=%~nx0"
    
        set "OptHelp="
        set "OptVersion="
        set "OptVerbose="
    
        set "UnNamedArgument="
        set "UnNamedOptionalArg="
        set "NamedFlag="
    
    :parse
        if "%~1"=="" goto :validate
    
        if /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :end
        if /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :end
        if /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :end
    
        if /i "%~1"=="/v"         call :version      & goto :end
        if /i "%~1"=="-v"         call :version      & goto :end
        if /i "%~1"=="--version"  call :version full & goto :end
    
        if /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parse
        if /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parse
        if /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parse
    
        if /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parse
    
        if not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parse
        if not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parse
    
        shift
        goto :parse
    
    :validate
        if not defined UnNamedArgument call :missing_argument & goto :end
    
    :main
        if defined OptVerbose (
            echo **** DEBUG IS ON
        )
    
        echo UnNamedArgument:    "%UnNamedArgument%"
    
        if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
        if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not provided
    
        if defined NamedFlag               echo NamedFlag:          "%NamedFlag%"
        if not defined NamedFlag           echo NamedFlag:          not provided
    
    :end
        call :cleanup
        exit /B
    
    :cleanup
        REM The cleanup function is only really necessary if you
        REM are _not_ using SETLOCAL.
        set "__NAME="
        set "__VERSION="
        set "__YEAR="
    
        set "__BAT_FILE="
        set "__BAT_PATH="
        set "__BAT_NAME="
    
        set "OptHelp="
        set "OptVersion="
        set "OptVerbose="
    
        set "UnNamedArgument="
        set "UnNamedArgument2="
        set "NamedFlag="
    
        goto :eof
     
    ответ дан wasatchwizard, с репутацией 1466, 13.07.2017
  • 0 рейтинг

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

    Скажем, мы хотим реализовать утилиту foobar . Для этого требуется начальная команда. Он имеет необязательный параметр --foo который принимает необязательное значение (которое, конечно, не может быть другим параметром); если значение отсутствует, по умолчанию оно равно default . Он также имеет необязательный параметр --bar который принимает требуемое значение. Наконец, он может принимать флаг --baz без допустимого значения. О, и эти параметры могут прийти в любом порядке.

    Другими словами, это выглядит так:

     foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]
     

    Вот решение:

     @ECHO OFF
    SETLOCAL
    REM FooBar parameter demo
    REM By Garret Wilson
    
    SET CMD=%~1
    
    IF "%CMD%" == "" (
      GOTO usage
    )
    SET FOO=
    SET DEFAULT_FOO=default
    SET BAR=
    SET BAZ=
    
    SHIFT
    :args
    SET PARAM=%~1
    SET ARG=%~2
    IF "%PARAM%" == "--foo" (
      SHIFT
      IF NOT "%ARG%" == "" (
        IF NOT "%ARG:~0,2%" == "--" (
          SET FOO=%ARG%
          SHIFT
        ) ELSE (
          SET FOO=%DEFAULT_FOO%
        )
      ) ELSE (
        SET FOO=%DEFAULT_FOO%
      )
    ) ELSE IF "%PARAM%" == "--bar" (
      SHIFT
      IF NOT "%ARG%" == "" (
        SET BAR=%ARG%
        SHIFT
      ) ELSE (
        ECHO Missing bar value. 1>&2
        ECHO:
        GOTO usage
      )
    ) ELSE IF "%PARAM%" == "--baz" (
      SHIFT
      SET BAZ=true
    ) ELSE IF "%PARAM%" == "" (
      GOTO endargs
    ) ELSE (
      ECHO Unrecognized option %1. 1>&2
      ECHO:
      GOTO usage
    )
    GOTO args
    :endargs
    
    ECHO Command: %CMD%
    IF NOT "%FOO%" == "" (
      ECHO Foo: %FOO%
    )
    IF NOT "%BAR%" == "" (
      ECHO Bar: %BAR%
    )
    IF "%BAZ%" == "true" (
      ECHO Baz
    )
    
    REM TODO do something with FOO, BAR, and/or BAZ
    GOTO :eof
    
    :usage
    ECHO FooBar
    ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
    EXIT /B 1
     
    • Используйте SETLOCAL чтобы переменные не выходили в вызывающую среду.
    • Не забудьте инициализировать переменные SET FOO= и т. Д., Если кто-то определил их в вызывающей среде.
    • Используйте %~1 для удаления котировок.
    • Используйте --foo а не --foo потому что --foo и --foo не играют вообще со значениями, заканчивающимися пробелом.
    • Даже если вы --foo внутри --foo блоков, текущие аргументы, такие как --foo , не обновляются, потому что они определяются при анализе --foo . Вы можете использовать --foo и --foo в default блоках, но это будет путать, потому что у вас есть default . Вы можете поместить default в конец блока для ясности, но это может затеряться и / или сбить с толку людей. Так что «захват» default и default вне блока кажется лучшим.
    • Вы не хотите использовать параметр вместо дополнительного значения другого параметра, поэтому вам нужно проверить default .
    • Будьте внимательны только до default когда вы используете один из параметров.
    • Дублирующий код default прискорбный, но альтернативой было бы добавить default вне default блока. Однако, поскольку это все еще находится внутри --bar блока, значение --bar было бы оценено и установлено до того, как вы когда-либо введете блок, поэтому вы никогда не обнаружите, что оба параметра --bar присутствовали, а также что значение --bar отсутствует.
    • Обратите внимание, что --bar отправляет сообщение об ошибке в stderr.
    • Хотите пустую строку в пакетном файле Windows? Вы должны использовать --bar или один из вариантов.
    ответ дан Garret Wilson, с репутацией 5669, 2.06.2018
  • 0 рейтинг

    Доступ к параметрам партии может быть простым с% 1,% 2, ...% 9 или также% *,
    но только если контент прост.

    Для сложного содержимого, такого как "&"^& , нет простого способа, так как невозможно получить доступ к% 1 без возникновения ошибки.

     set  var=%1
    set "var=%1"
    set  var=%~1
    set "var=%~1"
     

    Линии расширяются до

     set  var="&"&
    set "var="&"&"
    set  var="&"&
    set "var="&"&"
     

    И каждая строка выходит из строя, так как одна из & находится вне кавычек.

    Его можно решить, прочитав из временного файла отмеченную версию параметра.

     @echo off
    SETLOCAL DisableDelayedExpansion
    
    SETLOCAL
    for %%a in (1) do (
        set "prompt="
        echo on
        for %%b in (1) do rem * #%1#
        @echo off
    ) > param.txt
    ENDLOCAL
    
    for /F "delims=" %%L in (param.txt) do (
      set "param1=%%L"
    )
    SETLOCAL EnableDelayedExpansion
    set "param1=!param1:*#=!"
    set "param1=!param1:~0,-2!"
    echo %%1 is '!param1!'
     

    Трюк состоит в том, чтобы включить echo on и развернуть% 1 после инструкции rem (работает также с %2 .. %* ).
    Таким образом, даже "&"& можно было отследить, не производя ошибки, как это отмечено.

    Но чтобы иметь возможность перенаправлять вывод из echo on , вам нужны два for-loops.

    Дополнительные символы set var=%1 set "var=%1" set var=%~1 set "var=%~1" используются для защиты от содержимого, такого как set var=%1 set "var=%1" set var=%~1 set "var=%~1" (покажет помощь для set var=%1 set "var=%1" set var=%~1 set "var=%~1" ).
    Или каретка на конце линии может работать как многострочный символ, даже после set var=%1 set "var=%1" set var=%~1 set "var=%~1" .

    Затем, считывая выходной параметр rem из файла, но тщательно.
    FOR / F должен работать с отложенным расширением, иначе содержимое с помощью «!» будут уничтожены.
    После удаления дополнительных символов в set var=%1 set "var=%1" set var=%~1 set "var=%~1" вы получили его.

    И чтобы использовать set var=%1 set "var=%1" set var=%~1 set "var=%~1" в безопасном режиме, включите замедленное расширение.

    ответ дан jeb, с репутацией 56196, 30.03.2011
  • 0 рейтинг

    Я написал простой скрипт read_params, который можно назвать функцией (или внешним .bat ) и поместит все переменные в текущую среду. Он не будет изменять исходные параметры, потому что функция call редактируется с копией исходных параметров.

    Например, учитывая следующую команду:

     myscript.bat some -random=43 extra -greeting="hello world" fluff
     

    myscript.bat могли бы использовать переменные после вызова функции:

     call :read_params %*
    
    echo %random%
    echo %greeting%
     

    Вот функция:

     :read_params
    if not %1/==/ (
        if not "%__var%"=="" (
            if not "%__var:~0,1%"=="-" (
                endlocal
                goto read_params
            )
            endlocal & set %__var:~1%=%~1
        ) else (
            setlocal & set __var=%~1
        )
        shift
        goto read_params
    )
    exit /B
     

    Ограничения

    • Невозможно загрузить аргументы без значения, например -force . Вы можете использовать -force=true но я не могу придумать, как разрешить пустые значения, не зная список параметров раньше времени, которые не будут иметь значения.

    Изменения

    • 2/18/2016
      • Больше не требуется отсроченное расширение
      • Теперь работает с другими аргументами командной строки, ища - перед параметрами.
    ответ дан Evan Kennedy, с репутацией 2057, 17.02.2016
  • 0 рейтинг

    Вот как я это делаю.

     @fake-command /u %1 /p %2
     

    Вот как выглядит командная строка:

     test.cmd admin P@55w0rd > test-log.txt
     

    % 1 применяется к первому параметру,% 2 (и вот эта сложная часть) относится ко второму. Таким образом можно передать до 9 параметров.

    ответ дан Keng, с репутацией 30321, 18.09.2008
  • 0 рейтинг
     @ECHO OFF
    :Loop
    IF "%1"=="" GOTO Continue
    SHIFT
    GOTO Loop
    :Continue
     

    Примечание: IF "%1"=="" вызовет проблемы, если %1 заключен в кавычки.

    В этом случае используйте IF [%1]==[] или вместо NT 4 (SP6) и позже IF "%~1"=="" .

    ответ дан rightcodeatrighttime, с репутацией 519, 14.03.2014
  • 0 рейтинг

    Да, и просто не забудьте использовать переменные типа %%1 при использовании if и for и банды.

    Если вы забудете double % , вы замените аргументы командной строки (возможно, null), и вы получите некоторые довольно запутанные сообщения об ошибках.

    ответ дан Frank Krueger, с репутацией 43457, 25.08.2008
  • 0 рейтинг

    Создайте новый командный файл (пример: openclass.bat) и напишите эту строку в файле:

     java %~n1
     

    Затем поместите пакетный файл, скажем, в папку system32, перейдите в свой файл класса Java, щелкните правой кнопкой мыши, «Свойства», «Открыть с ...», затем найдите пакетный файл, выберите его, и это все ...

    Меня устраивает.

    PS: Я не могу найти способ закрыть окно cmd, когда я закрываю Java-класс. Теперь...

    ответ дан SvenVP, с репутацией 83, 6.02.2011
  • 0 рейтинг

    Нет необходимости усложнять его. Это просто команда% 1% 2 параметров, например,

     @echo off
    
    xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z
    
    echo copied %1 to %2
    
    pause
     

    «Пауза» показывает, что сделал командный файл, и ждет, пока вы нажмете клавишу «ЛЮБОЙ». Сохраните это как xx.bat в папке Windows.

    Чтобы использовать его, введите, например:

     xx c:\f\30\*.* f:\sites\30
     

    Этот командный файл выполняет все необходимые параметры, такие как копирование только новых файлов и т. Д. Я использовал его до Windows. Если вам нравится просматривать имена файлов, поскольку они копируются, оставьте параметр Q .

    ответ дан DearWebby, с репутацией 525, 18.04.2012
  • 0 рейтинг

    Давайте сделаем это просто.

    Вот файл .cmd.

     @echo off
    rem this file is named echo_3params.cmd
    echo %1
    echo %2
    echo %3
    set v1=%1
    set v2=%2
    set v3=%3
    echo v1 equals %v1%
    echo v2 equals %v2%
    echo v3 equals %v3%
     

    Вот 3 вызова из командной строки.

     C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
    1abc
    2
    def
    v1 equals 1abc
    v2 equals 2
    v3 equals def
    
    C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
    1abc
    "2 def"
    "3 ghi"
    v1 equals 1abc
    v2 equals "2 def"
    v3 equals "3 ghi"
    
    C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
    1abc
    '2
    def'
    v1 equals 1abc
    v2 equals '2
    v3 equals def'
    
    C:\Users\joeco>
     
    ответ дан Love and peace - Joe Codeswell, с репутацией 1342, 31.12.2015