programing

".bat" 파일에서 명령줄 매개 변수를 확인하는 방법

goodcopy 2023. 4. 8. 11:20
반응형

".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 - 어떻게 해야 하는지 배웠기를 바랍니다..batHINT: 바쉬하다위의 인수에는 공백이 포함되어 있습니다.하지만 인용문은 자동으로 삭제되지 않습니다.

아르규는요?그것에 대한 반응은 어떻습니까?예상대로:

D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.

그래서 - 말하기 전에 생각해 보세요: "뭐가?따옴표만 사용하세요.[내가 보기엔 이게 더 낫기 때문에]

편집

최근, 이 답변에 대한 코멘트가 있었습니다.- 음, 사각 괄호는 인용된 주장을 전달하고 인용되지 않은 것처럼 취급합니다.

구문:

if "%~1"=="" (...)

큰따옴표에서 새로 발견된 장점이 아니라 첫 번째와 마지막 문자가 큰따옴표일 경우 인수변수에서 따옴표를 삭제하는 깔끔한 기능의 표시입니다.

이 「테크놀로지」는, 대괄호에서도 유효하게 동작합니다.

if [%~1]==[] (...)

이것을 지적하는 것은 도움이 되기 때문에, 저도 새로운 답변을 상향 투표했습니다.

팬은 .""당신의 책에 존재하는가, 아니면 비어있는가?물어보세요 ★★★★★★★★★★★★★★★★★★★★★★★★★★)

답변과 , 도 이 답안지를 하는 것을 고려해 ./IIF명령어를 입력합니다.

... /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

반응형