ID와 비밀번호를 파일로 하드 코딩하는 대신 실행시 배치 파일에 전달해야합니다.
명령 행은 다음과 같습니다.
test.cmd admin P@55w0rd > test-log.txt
ID와 비밀번호를 파일로 하드 코딩하는 대신 실행시 배치 파일에 전달해야합니다.
명령 행은 다음과 같습니다.
test.cmd admin P@55w0rd > test-log.txt
답변:
또 다른 유용한 팁은 %*
"모두"를 의미하는 데 사용 하는 것입니다. 예를 들면 다음과 같습니다.
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
구문이 약간 잘못되었을 수 있지만 이것이 일반적인 아이디어입니다.
shift
목록에서 논증을 "팝핑" 한다고 생각한다 . OP의 가정 %*
은 나머지 인수 만 출력 할 것이지만 @Joey가 말한 것처럼 작동하지 않습니다.
fake-command /u admin /p password admin password foo bar
입니다. 이것은 몇 년 전 @Joey에 의해 지적되었습니다.
내가 한 방법은 다음과 같습니다.
@fake-command /u %1 /p %2
명령은 다음과 같습니다.
test.cmd admin P@55w0rd > test-log.txt
는 %1
제 매개 변수 적용 %2
(여기 까다로운 부분이다) 제에 적용된다. 이 방법으로 최대 9 개의 매개 변수를 전달할 수 있습니다.
echo %1 %2
a @
와 a fake-command
및 params를 가진 잘라 내기 및 붙여 넣을 수없는 가장 간단한 경우에 의해 던져졌습니다 fake-command.bat
. 너무 복잡 하면 매개 변수 이름을 무시 fake-command.bat
해야 echo %2 %4
할 수도 있습니다 ). 틀렸어, 두 푸스 TL; DR : 나만큼 바보하지 마십시오. 1. echo echo %1 %2 > test.bat
2 test word1 word2
.. 3. 이익.
누락 된 매개 변수를 지능적으로 처리하려면 다음과 같이하십시오.
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
% 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
안전한 방식으로, 지연 확장을 가능하게한다.
&
솔루션은 간단한 컨텐츠에서만 작동합니다.
test.bat ^&
실패합니다. 만 test.bat "&"
작동하지만, 그건 내 포인트 아니었다. 당신은 사용할 수 없습니다 %*
, %1
REM 수면의 기술이없는 안전한 방법으로
&
와 따옴표가 포함되어 있습니다. "
네, 그리고 갱 을 사용할 %%1
때 if
와 같은 변수를 사용하는 것을 잊지 마십시오 for
.
double을 잊어 버린 경우 %
(아마도 null 인) 명령 줄 인수로 대체하고 혼란스러운 오류 메시지가 나타납니다.
if
및 for
? 에만 해당됩니다 .
for %%d in (*) do echo %%d
명령 줄에서 :for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
배치 파일에서 testing 1
1 ( test 1
)로 호출 될 때 생성 됩니다 .
%%1
명령 행 인수에 액세스하지 않으며 명령에도 잘못되었습니다 IF
. FOR
배치 파일 의 명령 에만 두 배의 퍼센트가 필요하지만 %%1
FOR 매개 변수를 정의하고 인수에 액세스하지 않습니다
복잡 할 필요는 없습니다. 예를 들어, 명령 % 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
매개 변수를 생략하십시오 .
친구가 최근 에이 주제에 대해 묻고 있었기 때문에 배치 파일에서 명령 줄 인수를 처리하는 방법을 게시한다고 생각했습니다.
이 기술에는 약간의 오버 헤드가 있지만 배치 파일을 이해하기 쉽고 빠르게 구현할 수 있습니다. 다음 구조를 지원할뿐 아니라
>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
이것을 간단하게 유지합시다.
다음은 .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>
함수 (또는 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
있지만 값이없는 매개 변수 목록을 미리 알지 못하면 빈 값을 허용하는 방법을 생각할 수 없습니다.변경 로그
-
before 매개 변수 를 찾아 다른 명령 줄 인수와 함께 작동합니다 .@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
와를 사용할 수는 있지만으로 인해 혼란 스러울 수 있습니다 . 명확성을 위해 블록의 끝 부분에 넣을 수는 있지만 사람들을 잃거나 혼란스럽게 할 수 있습니다. 따라서 "캡처" 와 블록 외부가 가장 좋습니다.%~2
IF
SHIFT
SHIFT
%~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>&2
stderr에 오류 메시지를 보냅니다.ECHO:
하거나 변형 중 하나를 사용해야 합니다.새 배치 파일 (예 : openclass.bat)을 작성하고 파일에 다음 행을 작성하십시오.
java %~n1
그런 다음 배치 파일을 system32 폴더에 넣고 Java 클래스 파일로 이동하여 속성, 다음으로 열기 ...를 마우스 오른쪽 버튼으로 클릭 한 다음 배치 파일을 찾아 선택하십시오.
그것은 나를 위해 작동합니다.
추신 : Java 클래스를 닫을 때 cmd 창을 닫는 방법을 찾을 수 없습니다. 지금은 ...
start /wait java %~n1
간단한 해결책 (질문이 오래되었지만)
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을 사용하여 비교하십시오.
작성하는 것뿐만 아니라 유지 관리도 간단하므로 나중에 다른 사람이나 스크립트를 오랜 시간 후에 읽었다면 이해하고 유지하기가 쉽습니다.
인라인으로 코드를 작성하려면 다른 답변을 참조하십시오.
루핑을 사용하려면 모든 인수와 순수한 배치를 얻으십시오.
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
?*&<>