배치 파일에 인수를 전달하려면 어떻게해야합니까?


1167

ID와 비밀번호를 파일로 하드 코딩하는 대신 실행시 배치 파일에 전달해야합니다.

명령 행은 다음과 같습니다.

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


사용자 이름 / 비밀번호를 환경 변수에 푸시하는 환경 시작 스크립트가 있습니다 ... 그래서 매번 입력 할 필요가 없습니다 ... 나는 대부분 bash를 사용하고 있습니다 (linux, mac 및 Windows)와 같은 작업을 수행하기 위해 스크립트 등의 프록시 구성에 사용해야합니다.
추적자 1

답변:


1032

또 다른 유용한 팁은 %*"모두"를 의미하는 데 사용 하는 것입니다. 예를 들면 다음과 같습니다.

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 admin password foo bar

구문이 약간 잘못되었을 수 있지만 이것이 일반적인 아이디어입니다.


123
% *는 실제로 시프트에 관계없이 모든 매개 변수로 확장됩니다. 따라서 두 교대 후에도 여전히 % *의 첫 두 인수가 있습니다. 다음과 같은 것을 사용할 수 있습니다 : stackoverflow.com/questions/761615/… 첫 n 개의 매개 변수를 제외한 모든 것을 포함하는 변수를 가져옵니다.
Joey

1
% *는 모든 곳에서 작동하지 않습니다! 예를 들어, DOSBox 0.73에서는 작동하지 않습니다 (아마도 버그는보고해야합니다).
Denilson Sá Maia 2019

28
% *는 MS-DOS 나 Win9x에서 처음에는 작동하지 않았기 때문에 버그가 아닙니다.
Kef Schecter

나는 shift목록에서 논증을 "팝핑" 한다고 생각한다 . OP의 가정 %*은 나머지 인수 만 출력 할 것이지만 @Joey가 말한 것처럼 작동하지 않습니다.
NathanAldenSr

5
이 답변은 잘못되었습니다. 실제로 결과는 fake-command /u admin /p password admin password foo bar입니다. 이것은 몇 년 전 @Joey에 의해 지적되었습니다.
jwdonahue

286

내가 한 방법은 다음과 같습니다.

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

명령은 다음과 같습니다.

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

%1제 매개 변수 적용 %2(여기 까다로운 부분이다) 제에 적용된다. 이 방법으로 최대 9 개의 매개 변수를 전달할 수 있습니다.


16
당신이 나와 같이 멍청하다면, 당신의 마음은 echo %1 %2a @와 a fake-command및 params를 가진 잘라 내기 및 붙여 넣을 수없는 가장 간단한 경우에 의해 던져졌습니다 fake-command.bat. 너무 복잡 하면 매개 변수 이름을 무시 fake-command.bat해야 echo %2 %4할 수도 있습니다 ). 틀렸어, 두 푸스 TL; DR : 나만큼 바보하지 마십시오. 1. echo echo %1 %2 > test.bat2 test word1 word2.. 3. 이익.
ruffin

143

누락 된 매개 변수를 지능적으로 처리하려면 다음과 같이하십시오.

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

2
이러한 평등 연산에서 점 / 기간의 중요성은 무엇입니까?
Chris

4
기본적으로 % 1이 비어 있으면 결국 IF가됩니다. ==. 그래서 GOTO는 일어날 것입니다. 여기서 x를 사용합니다 : IF x % 1 == x-> IF x == x-> true
Carl

1
"제공되지 않은 인수"의 가치가 무엇인지 물어보아야합니까? "제공되지 않은 인수"를 확인해야 할 사항이 있습니까? 그런 다음 답이 없으면 점 중 하나와 같은 트릭을 사용해야합니다. 여기에 언급 된 것처럼 ss64.com/nt/if.html "실제로 '~'또는 중괄호, {} 또는 숫자 4에 거의 모든 문자를 사용할 수 있지만 대괄호는 일반적으로 선택되는 경향이 있습니다. 특별한 의미가 없습니다. "
Adriano GV Esposito

89

% 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-loop가 필요합니다.

추가 문자 * #/?(에 대한 도움말을 표시 할 것입니다 REM) 과 같은 내용에 대해 안전하도록 사용됩니다 .
또는 줄 끝의 캐럿 ^은 여러 줄 문자로도 사용할 수 rem있습니다.

그런 다음 파일에서 출력 된 rem 매개 변수를 주의 깊게 읽으십시오 .
FOR / F는 확장 지연이 해제 된 상태에서 작동하고 그렇지 않으면 "!" 파괴 될 것이다.
에서 추가 문자를 제거한 후 가져 왔습니다 param1.

그리고 사용하기에 param1안전한 방식으로, 지연 확장을 가능하게한다.


( 'echo % *')에서 / F "tokens = *"%% a에 대해 "all_args = %% a"를 설정 함
Kevin Edwards

@KevinEdwards 그런 다음 하나를 사용해보십시오. &솔루션은 간단한 컨텐츠에서만 작동합니다.
jeb

@KevinEdwards 테스트했는데 test.bat ^&실패합니다. 만 test.bat "&"작동하지만, 그건 내 포인트 아니었다. 당신은 사용할 수 없습니다 %*, %1REM 수면의 기술이없는 안전한 방법으로

아, 네, 캐럿은 제대로 탈출하지 못합니다. 따옴표가 필요합니다.이 따옴표는 내가 만난 모든 사용 사례에 적합합니다. 방금 전달하고 싶었습니다. 테스트 해 주셔서 감사합니다! 건배 :)
케빈 에드워즈

2
@jwdonahue 그렇습니다. 복잡하지만 복잡하지는 않습니다. 그러나 특히 비밀번호는 필요할 수 있습니다. 적어도 일부 비밀번호에는 앰퍼샌드 &와 따옴표가 포함되어 있습니다. "
jeb

59

네, 그리고 갱 을 사용할 %%1if와 같은 변수를 사용하는 것을 잊지 마십시오 for.

double을 잊어 버린 경우 %(아마도 null 인) 명령 줄 인수로 대체하고 혼란스러운 오류 메시지가 나타납니다.


%%는 iffor? 에만 해당됩니다 .
Royi Namir

25
-%%는 배치 파일 내부의 변수 및 명령 줄 매개 변수를 접두사로 사용하는 것보다 나쁩니다 . 그러나 명령 행에서이 명령을 사용하는 경우 접 두부로 % 만 사용하십시오. 예 : 내부 배치 : for %%d in (*) do echo %%d명령 줄에서 :for %d in (*) do echo %d
Steve Midgley

11
@SteveMidgley 아마 1 년 정도 전에 귀하의 의견을 찬성했습니다. 나는 즉시 그것을 잊어 버렸고 오늘 막 나는 명령 줄에서 for 루프를 혼란스럽게 쳐다 보며 왜 그것이 방귀하고 다른 것을하지 않았는지 궁금해했다. 여기 또 다른 가상 공감대가 있습니다. 같은 문제가 다시 발생하면 다른 해에 다시 돌아올 것입니다.
icc97

우리는 일반적으로 커맨드 라인 처리를 위해 숫자를 예약하고 이중 퍼센트는 내가 아는 한 for 문에만 적용됩니다. @for %%2 in (testing) do @echo %%2 %1배치 파일에서 testing 11 ( test 1)로 호출 될 때 생성 됩니다 .
jwdonahue

2
답이 틀렸다. %%1명령 행 인수에 액세스하지 않으며 명령에도 잘못되었습니다 IF. FOR배치 파일 의 명령 에만 두 배의 퍼센트가 필요하지만 %%1FOR 매개 변수를 정의하고 인수에 액세스하지 않습니다
jeb

51

복잡 할 필요는 없습니다. 예를 들어, 명령 % 1 % 2 매개 변수입니다.

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

"일시 정지"는 배치 파일이 수행 한 작업을 표시하고 ANY 키를 누를 때까지 기다립니다. Windows 폴더에 xx.bat로 저장하십시오.

사용하려면 다음과 같이 입력하십시오.

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

이 배치 파일은 파일 복사, 최신 파일 등 필요한 모든 매개 변수를 처리합니다. Windows 이전부터 사용했습니다. 파일이 복사되는 동안 파일 이름을보고 싶다면 Q매개 변수를 생략하십시오 .


41

친구가 최근 에이 주제에 대해 묻고 있었기 때문에 배치 파일에서 명령 줄 인수를 처리하는 방법을 게시한다고 생각했습니다.

이 기술에는 약간의 오버 헤드가 있지만 배치 파일을 이해하기 쉽고 빠르게 구현할 수 있습니다. 다음 구조를 지원할뿐 아니라

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

그것의 JIST가 구비되고 :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

32
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

참고 : 따옴표로 묶인 "%1"==""경우 IF 로 인해 문제가 발생할 수 있습니다 %1.

이 경우 IF [%1]==[]또는 IF "%~1"==""대신 NT 4 (SP6) 이상에서 또는를 사용하십시오.


충분하지만 주제에 거의 영향을 미치지 않습니다.
jwdonahue

22

이것을 간단하게 유지합시다.

다음은 .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>

20
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

이렇게하면 배치 매개 변수 (% *)가 인용되거나 인용되지 않고 반복 된 다음 각 매개 변수가 에코됩니다.


그러나 test.bat *.txt, test.bat cat^&dog또는Test.bat /?
jeb

19

함수 (또는 external .bat) 로 호출 할 수 있고 모든 변수를 현재 환경에 넣을 간단한 read_params 스크립트를 작성했습니다 . 함수가 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있지만 값이없는 매개 변수 목록을 미리 알지 못하면 빈 값을 허용하는 방법을 생각할 수 없습니다.

변경 로그

  • 2016 년 2 월 18 일
    • 더 이상 지연 확장이 필요하지 않습니다
    • 이제 -before 매개 변수 를 찾아 다른 명령 줄 인수와 함께 작동합니다 .

이 방법으로 배치 파일에 인수를 전달하고 싶을 때이 방법을 사용하는 것을 보았습니다. 그러나 변수가 설정된 후 배치 파일을 종료 한 후에도 매개 변수가 cmd에 설정되어 있고 배치가 종료되면 이전 상태로 복원되지 않습니다. 이 방법으로 해당 상황을 처리해야합니까?
Jono_2007

주제에 대해이 스레드의 나머지 답변보다 낫습니다.
jwdonahue

값없이 플래그 인수를 지원하도록 확장했습니다. 형식이 부족하여 죄송하지만 주석에서는 작동하지 않습니다. "-"(endlocal goto read_params) endlocal & set % __ var : ~ 1 % = % ~ 1) else (setlocal & set __var = % ~ 1) goto read_params) else ( "% __ var %"== "가 아닌 경우) (endlocal & set % __ var : ~ 1 % = 1)
최대

13

배치 파일에서

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

% 1 및 % 2는 각각 첫 번째 및 두 번째 인수 값을 반환합니다.

그리고 커맨드 라인에서 arguemt를 전달하십시오.

Directory> batchFileName admin P@55w0rd 

출력은

admin
P@55w0rd

9

명령 행에서 설정 변수를 참조하려면 다음과 같이 사용해야합니다 %a%.

set a=100 
echo %a%  
rem output = 100 

참고 : 이것은 Windows 7 pro에서 작동합니다.


6

@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따옴표를 제거하는 데 사용하십시오 .
  • 사용 IF "%ARG%" == ""하지 IF [%ARG%] == []때문에 [그리고 ]공간 끝나는 값으로 전혀 뜻을 재생되지 않습니다.
  • 블록 SHIFT내부에 있어도 IF현재 인수 는 구문 분석 %~1될 때 결정되므로 업데이트되지 않습니다 IF. 블록 내부 %~1와를 사용할 수는 있지만으로 인해 혼란 스러울 수 있습니다 . 명확성을 위해 블록의 끝 부분에 넣을 수는 있지만 사람들을 잃거나 혼란스럽게 할 수 있습니다. 따라서 "캡처" 와 블록 외부가 가장 좋습니다.%~2IFSHIFTSHIFT%~1%~1
  • 다른 매개 변수의 선택적 값 대신 매개 변수를 사용하지 않으려면 확인해야 IF NOT "%ARG:~0,2%" == "--"합니다.
  • 매개 변수 중 하나 SHIFT사용할 때만주의하십시오 .
  • 중복 코드 SET FOO=%DEFAULT_FOO%는 유감이지만 대안은 블록 IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%외부 에 추가하는 것 IF NOT "%ARG%" == ""입니다. 이것은 내부에 여전히 그러나 때문에 IF "%PARAM%" == "--foo"블록의 %FOO%값이 평가 된 것이며, 당신이 이제까지 블록을 입력하기 전에 감지 절대 있도록 설정 모두--foo 매개 변수가 존재 하고 또한 것을 %FOO%값이 누락되었습니다.
  • 참고 ECHO Missing bar value. 1>&2stderr에 오류 메시지를 보냅니다.
  • Windows 배치 파일에 빈 줄이 필요하십니까? 사용 ECHO:하거나 변형 중 하나를 사용해야 합니다.

4

새 배치 파일 (예 : openclass.bat)을 작성하고 파일에 다음 행을 작성하십시오.

java %~n1

그런 다음 배치 파일을 system32 폴더에 넣고 Java 클래스 파일로 이동하여 속성, 다음으로 열기 ...를 마우스 오른쪽 버튼으로 클릭 한 다음 배치 파일을 찾아 선택하십시오.

그것은 나를 위해 작동합니다.

추신 : Java 클래스를 닫을 때 cmd 창을 닫는 방법을 찾을 수 없습니다. 지금은 ...


배치 스크립트에서 다음 명령을 사용하여 프로세스가 닫힌 후 cmd 창을 닫을 수 있습니다.start /wait java %~n1
Paint_Ninja

1
system32 디렉토리에 임의의 스크립트 파일을 넣도록 일반인에게 조언하는 것은 무책임합니다. 이 답변은 실제로이 스레드의 주제 표면을 긁지 않습니다.
jwdonahue

2

간단한 해결책 (질문이 오래되었지만)

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가 현재 디렉토리 경로입니다.

일을 단순하게 유지하려면 명령 param을 변수에 저장하고 variable을 사용하여 비교하십시오.

작성하는 것뿐만 아니라 유지 관리도 간단하므로 나중에 다른 사람이나 스크립트를 오랜 시간 후에 읽었다면 이해하고 유지하기가 쉽습니다.

인라인으로 코드를 작성하려면 다른 답변을 참조하십시오.


2

여기에 이미지 설명을 입력하십시오

루핑을 사용하려면 모든 인수와 순수한 배치를 얻으십시오.

Obs : 없이 사용하는 경우 :?*&<>


@echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && (
     call set "_arg_[!_cnt!]=!_arg_!" && for /l %%l in (!_cnt! 1 !_cnt!
     )do echo/ The argument n:%%l is: !_arg_[%%l]!
 )

goto :eof 

코드는 필요한 경우 인수 번호로 무언가를 수행 할 준비가되었습니다.

 @echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && call set "_arg_[!_cnt!]=!_arg_!"
 )

 fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt

1
그러나 암호에?*&<>
jeb

@jeb 나는 노트 추가 한, 다시 한번 감사드립니다 : OBS를 ... 핸들이 문자에 대한 새로운 편집까지 대답에
그것은 나 아니 었
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.