".bat" 파일에서 명령줄 매개 변수를 확인하는 방법
OS(R) Windows Vista.사용자가 명령줄 매개 변수를 입력했는지 확인해야 하는 ".bat" 파일이 필요합니다.가 ""와 -b
유효하지 않은 입력입니다.사용자가 명령줄 매개 변수를 입력하지 않으면 작업을 수행합니다..bat을 사용하다효과가 있다-b
와는 비교가 안 된다-b
- 단, 하지 않으면 실패합니다. - , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .
항상 에러가 발생합니다.
GOTO was unexpected at this time.
내가 여기서 뭘 잘못하고 있는지 누가 말해줄래?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
.if "%~1"=="" goto blank
if -b: 런음음 음음 음/ if/else 스-.-b:if "%~1"=="-b" (goto specific) else goto unknown
파라미터를 따옴표로 둘러싸면 빈 파라미터, 빈 파라미터, 누락된 파라미터 등을 쉽게 확인할 수 있습니다."~"를 사용하면 명령줄 인수에 있는 경우 큰따옴표가 삭제됩니다.
답변에 대해서는http://http://ss64.com/nt/if.html 를 참조해 주세요.명령어는 다음과 같습니다.IF [%1]==[] GOTO NO_ARGUMENT
또는 이와 유사합니다.
짧은 답변 - 대괄호 사용:
if [%1]==[] goto :blank
또는 (따옴표로 묶인 arg를 처리할 필요가 있는 경우는, 다음의 「편집」을 참조해 주세요).
if [%~1]==[] goto :blank
왜요? 물어보실 수도 있어요.Jeremia Willcock이 언급했듯이, http://ss64.com/nt/if.html - 그들은 그것을 사용한다!좋아요, 그런데 그 인용문은 뭐가 문제죠?
다시 한 번, 짧은 답변입니다.이것들은 "만화"입니다.때로는 이중 따옴표가 단일 따옴표로 변환되기도 합니다.우선 둘이 일치해야 해
이 작은 스크립트를 검토해 주십시오.
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
테스트해 봅시다.
C:\> argq bla bla
bla
bla
Done.
효과가 있는 것 같아.이제 2단 기어로 전환합니다.
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom 이것은 사실로 평가되지 않았고 거짓으로 평가되지도 않았다.스크립트는 DEAD.만약 원자로를 끄기로 되어있다면, 운이 나빴다.넌 이제 해리 다글리안처럼 죽을 거야
'네, 인수에는 따옴표를 사용할 수 없습니다'라고 생각할 수 있습니다.그렇게 되면 이런 일이 벌어집니다.틀렸습니다. 위안이 됩니다.
C:\> argq ""bla bla""
""bla
bla""
Done.
오, 그래.걱정하지 마세요. 가끔은 이 방법이 효과가 있을 거예요.
다른 스크립트를 사용해 보겠습니다.
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
상기의 케이스에 대해서, 정상적으로 동작하고 있는 것을 스스로 테스트할 수 있습니다.이것은 논리적입니다.따옴표는 괄호와는 관계가 없기 때문에 마법은 없습니다.하지만 아르그에 괄호를 달아주는 건 어때?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
거긴 운이 없어. 졸라매지 .cmd.exe
의 파서입니다.
잠시 악명높은 인용구로 돌아가 봅시다.논쟁이 인용구로 끝났을 때 문제가 있었습니다.
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
그냥 통과하면 어떡해?
D:\>argq bla2"
The syntax of the command is incorrect.
스크립트가 전혀 실행되지 않습니다.일일도 입니다.args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
하지만 내가 얻는 게 뭐지?"
이러한 경우, -는 "짝수"입니다.
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - 어떻게 해야 하는지 배웠기를 바랍니다..bat
HINT: 바쉬하다위의 인수에는 공백이 포함되어 있습니다.하지만 인용문은 자동으로 삭제되지 않습니다.
아르규는요?그것에 대한 반응은 어떻습니까?예상대로:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
그래서 - 말하기 전에 생각해 보세요: "뭐가?따옴표만 사용하세요.[내가 보기엔 이게 더 낫기 때문에]
편집
최근, 이 답변에 대한 코멘트가 있었습니다.- 음, 사각 괄호는 인용된 주장을 전달하고 인용되지 않은 것처럼 취급합니다.
구문:
if "%~1"=="" (...)
큰따옴표에서 새로 발견된 장점이 아니라 첫 번째와 마지막 문자가 큰따옴표일 경우 인수변수에서 따옴표를 삭제하는 깔끔한 기능의 표시입니다.
이 「테크놀로지」는, 대괄호에서도 유효하게 동작합니다.
if [%~1]==[] (...)
이것을 지적하는 것은 도움이 되기 때문에, 저도 새로운 답변을 상향 투표했습니다.
팬은 .""
당신의 책에 존재하는가, 아니면 비어있는가?물어보세요 ★★★★★★★★★★★★★★★★★★★★★★★★★★)
답변과 , 도 이 답안지를 하는 것을 고려해 ./I
의 IF
명령어를 입력합니다.
... /I 스위치는 지정된 경우 대소문자를 구분하지 않는 문자열을 비교하도록 지시합니다.
사용자가 파라미터를 지정할 수 있도록 대소문자를 구분하지 않는 유연성을 부여하는 경우 도움이 될 수 있습니다.
IF /I "%1"=="-b" GOTO SPECIFIC
이치노되어 있는 는, 「」입니다.%1
가 「」가 됩니다.IF =="-b" GOTO SPECIFIC
이치노문자열을 따옴표(또는 대괄호)로 묶습니다.
REM this is ok
IF [%1]==[/?] GOTO BLANK
REM I'd recommend using quotes exclusively
IF "%1"=="-b" GOTO SPECIFIC
IF NOT "%1"=="-b" GOTO UNKNOWN
사실 다른 모든 답변에는 결함이 있습니다.가장 신뢰할 수 있는 방법은 다음과 같습니다.
IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
상세설명:
「」를 사용합니다."%1"=="-b"
공백과 따옴표로 인수를 전달하면 크래시가 발생합니다.이치노
IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
C:\> run.bat "a b"
b""=="-b" was unexpected at this time.
「」를 사용합니다.[%1]==[-b]
공백과 따옴표로 크래시하지 않는 것이 좋지만 인수가 따옴표로 둘러싸여 있으면 일치하지 않습니다.
IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
C:\> run.bat "-b"
(does not match, and jumps to UNKNOWN instead of SPECIFIC)
사용."%~1"=="-b"
가장 신뢰할 수 있습니다. %~1
따옴표가 있는 경우 주변 따옴표를 제거합니다.따옴표 없이 arg 없이 사용할 수 있습니다.
IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
C:\> run.bat
C:\> run.bat -b
C:\> run.bat "-b"
C:\> run.bat "a b"
(all of the above tests work correctly)
최근에는 배치 파일에 복잡한 파라미터 스위치를 실장하는 데 어려움을 겪고 있습니다.이러한 조사 결과가 있습니다.제공된 답변 중 완전히 안전한 답변은 없습니다. 예를 들어 다음과 같습니다.
"%1"=="-?"
파라미터가 따옴표로 둘러싸인 경우(파일명 등에 필요), 파라미터가 따옴표로 둘러싸인 경우(파일명에 자주 표시됨)는 일치하지 않습니다.
@ECHO OFF
SETLOCAL
echo.
echo starting parameter test...
echo.
rem echo First parameter is %1
if "%1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)
C:\>test.bat -?
starting parameter test...
Condition is true, param=-?
C:\>test.bat "-?"
starting parameter test...
Condition is false, param="-?"
대괄호와의 임의의 조합[%1]==[-?]
★★★★★★★★★★★★★★★★★」[%~1]==[-?]
파라미터에 따옴표 안에 공백이 있는 경우 가 실패합니다.
@ECHO OFF
SETLOCAL
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if [%~1]==[-?] (echo Condition is true, param=%1) else (echo Condition is false, param=%1)
C:\>test.bat "long file name"
starting parameter test...
First parameter is "long file name"
file was unexpected at this time.
된 가장 한 해결책"%~1"=="-?"
에 있는 .
@ECHO OFF
SETLOCAL
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if "%~1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)
C:\>test.bat -source:"long file name"
starting parameter test...
First parameter is -source:"long file name"
file was unexpected at this time.
위의 모든 시나리오를 커버할 수 있는 유일한 방법은 EnableDelayedExpansion을 사용하고 변수를 사용하여 파라미터를 참조(값별이 아닌)로 전달하는 것입니다.그러면 가장 복잡한 시나리오도 정상적으로 작동합니다.
@ECHO OFF
SETLOCAL EnableDelayedExpansion
echo.
echo starting parameter test...
echo.
echo First parameter is %1
:: we assign the parameter to a variable to pass by reference with delayed expansion
set "var1=%~1"
echo var1 is !var1!
:: we assign the value to compare with to a second variable to pass by reference with delayed expansion
set "var2=-source:"c:\app images"\image.png"
echo var2 is !var2!
if "!var1!"=="!var2!" (echo Condition is true, param=!var1!) else (echo Condition is false, param=!var1!)
C:\>test.bat -source:"c:\app images"\image.png
starting parameter test...
First parameter is -source:"c:\app images"\image.png
var1 is -source:"c:\app images"\image.png
var2 is -source:"c:\app images"\image.png
Condition is true, param=-source:"c:\app images"\image.png
C:\>test.bat -source:"c:\app images"\image1.png
starting parameter test...
First parameter is -source:"c:\app images"\image1.png
var1 is -source:"c:\app images"\image1.png
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images"\image1.png
C:\>test.bat -source:"c:\app images\image.png"
starting parameter test...
First parameter is -source:"c:\app images\image.png"
var1 is -source:"c:\app images\image.png"
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images\image.png"
에는 이미 답이 몇 개, 이 다 '아까워서'라는 것 같습니다.그러나 모든 답변은 이 질문의 사용을 고집하는 것 같습니다.goto
.
를 goto
하는 경우, 하지만 괄호 2023을 .(
)
그 if
★★★★★★ 。
따라서 다음과 같은 배치 파일을 만들 수 있습니다.
@echo off
if "%~1"=="full" (
echo hello
echo hello again
)
echo hello always
하여 이 하면 다음과 같습니다.if_argument_test.bat full
뭇매를 맞다
hello
hello again
hello always
를 하지 않고 full
을 사용하다
hello always
이 배치코드는 이 코드보다 깔끔합니다.goto
.
언급URL : https://stackoverflow.com/questions/4953170/how-to-check-command-line-parameter-in-bat-file
'programing' 카테고리의 다른 글
Bash 스크립트를 사용하여 사용자 계정과 비밀번호를 자동으로 추가하는 방법은 무엇입니까? (0) | 2023.04.08 |
---|---|
.Net 데이터 구조:Array List, List, HashTable, Dictionary, Sorted List, Sorted Dictionary -- 속도, 메모리, 사용 시기 (0) | 2023.04.08 |
Angularjs 세션스토리지 및 범위 (0) | 2023.03.30 |
Json을 사용하여 Web API에서 응답을 직렬화하지 못했습니다. (0) | 2023.03.29 |
JSON을 CSV 형식으로 변환하고 변수에 저장하는 방법 (0) | 2023.03.29 |