배치 파일을 시작 / 호출 할 때 인수가 정의되어 있는지 어떻게 확인할 수 있습니까?


97

배치 파일에서 다음 유효성 검사 논리를 사용하려고하는데 배치 파일에 매개 변수가 제공되지 않은 경우에도 "사용"블록이 실행되지 않습니다.

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

내가 뭘 잘못하고 있죠?



@ double-beep-여기에있는 질문 (daniel-fortunov에 의해)은 당신이 언급 한 질문이 게시되기 약 1 년 전에 먼저 질문되었습니다. (가능한) 중복은 무엇입니까?
Kevin Fegan

@KevinFegan 다른 질문에는 더 많은 조회수와 더 많은 답변이 있기 때문입니다.
이중 신호음

답변:


147

명령 줄 인수가 설정되었는지 여부를 확인할 수 있습니다. [%1]==[] 으로,하지만 데이브 코스타는 지적 , "%1"==""또한 뜻이 작동합니다.

또한보다 큼 및보다 작음 기호를 이스케이프하기 위해 사용 에코의 구문 오류를 수정했습니다. 또한 인수 가 exit필요 /B하지 않으면 CMD.exe종료됩니다.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

18
[% 1] == []은 % 1 자체에 큰 따옴표가 포함 된 경우를 올바르게 처리하므로 "% 1"== ""보다 낫습니다. "% 1"== ""는 "현재 예기치 않은"메시지와 함께 오류를 발생시킵니다.
테쿠 마라

2
명령 줄 인수를 사용 set하지 않고 변수를 사용하는 경우 (올바른 배치 용어를 모르겠습니다) 사용할 "%myvar%"==""myvar있습니다. 공백이 있고 따옴표가 없으면 "현재 예기치 않은 " 메시지.
Pat

1
@Pat SET 변수는 IF NOT DEFINED VarName블록 으로 확인할 수 있습니다 . 또한 비교에서 따옴표를 사용하지 않은 경우 tukushan에 +1합니다. 그냥 하지마. 못.
Fr0sT

10
"%~1"==""% 1에 큰 따옴표가있는 경우도 작동하고 처리합니다
Drakkim

8
"%~1"==""[]버전은 그렇지 않지만 변수의 공백을 처리합니다 .
Cookie Butter

17

고급 예 :

⍟ 무제한 인수.

⍟ 파일 시스템 ( file또는 directory?) 또는 일반 string.

⍟ 파일인지 지정

⍟ 지정은 디렉토리입니다

⍟ 확장이 없으며 레거시 스크립트에서 작동합니다!

최소한의 코드 ☺

@ 에코 끄기

:고리
      :: -------------------------- 인수가 있습니까?
      if [ "% ~ 1"] == [ ""] (
        에코 완료.
        끝으로 이동
      )
      :: -------------------------- 인수가 있습니까?
      존재하지 않는 경우 % ~ s1 (
        에코가 존재하지 않습니다
      ) 다른 (
        에코 존재
        존재하는 경우 % ~ s1 \ NUL (
          echo는 디렉토리입니다.
        ) 다른 (
          echo는 파일입니다
        )
      )
      :: --------------------------
      시프트
      고토 루프
      
      
:종료

중지

✨ 기타 물건 ..✨

에 ■ %~1- ~어떤 포장을 제거합니다 "또는' .

■ in-경로를 다음 과 %~s1같이 s만듭니다. DOS 8.3 naming이는 파일 이름에 공백을 피하고 물건을 확인하는 좋은 방법입니다 (이렇게하면 리소스를 더 많은 코드로 래핑 할 필요가 없습니다)." 들.

["%~1"]==[""]인수가 파일 / 디렉토리이거나 아직 일반 문자열 인 경우 "확실 할 수 없음"이므로 대신 표현식은 대괄호와 수정되지 않은 원본을 사용 %1합니다 (" 줄 바꿈 ,있는 경우).

우리가 사용한 경우 인수가없고 인수 shift목록 포인터가 마지막 포인터를 전달한 경우 식은 다음과 같이 평가됩니다.[""]==[""] 입니다.

■ 이것은 더 많은 트릭을 사용하지 않고도 가능한 한 구체적입니다 (Windows-95의 배치 스크립트에서도 작동합니다 ...).

■ 실행 예

다른 이름으로 저장 identifier.cmd

무제한 인수를 식별 할 수 있습니다 (일반적으로 %1- 로 제한됨 %9). 인수를 반전 된 쉼표로 감싸거나 8.3 이름 지정을 사용하거나 드래그 앤 드롭 (위 중 하나를 자동으로 수행)하는 것을 기억하십시오.


이를 통해 다음 명령을 실행할 수 있습니다.

identifier.cmd c:\windows

있다
디렉토리입니다
끝난

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" 및 얻기

있다
파일입니다
끝난

⓷ 및 여러 인수 (물론 이것은 전체 거래입니다 ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

그리고 얻을

있다
디렉토리입니다
있다
파일입니다
있다
파일입니다
존재하지 않는다
끝난.

당연히 훨씬 더 복잡 할 수 있지만 좋은 예는 항상 단순하고 최소한이어야합니다. :)

누구에게나 도움이되기를 바랍니다 :)

여기에 게시 : CMD Ninja-무제한 인수 처리, 파일 시스템에 존재하는지 식별, 파일 또는 디렉토리 식별

다음은 원하는 양의 APK 파일 (Android 앱)을 가져와 debug-console (ADB.exe)을 통해 기기에 설치하는 작업 예제입니다 . 이전 게시물을 ADB 설치-다중 구문을 사용하지 않는 대량 APK 설치 프로그램으로 만듭니다.


14

괄호를 제거하십시오.

샘플 배치 파일 :

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

위 스크립트 실행의 출력 :

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

나는 실제로 괄호를 문자열의 일부로 취하고 비교되고 있다고 생각합니다.


1
if "%1"==""arg에 공백이 있으면 충돌합니다. 예 : run.bat "a b". @amr이 사용하기에 가장 좋은 답변을 가지고 있습니다if "%~1"==""
wisbucky

6
IF "%~1"=="" GOTO :Usage

~는 % 1 자체를 인용하면 % 1을 인용 해제합니다.

""은 전달 된 특수 문자로부터 보호합니다. 예를 들어 & ping을 사용하여 스크립트 호출


1
이것이 최고의 답변입니다. 다른 답변은 경우에 따라 작동하지만 더 특별한 경우에는 실패합니다run.bat "a b"
wisbucky

@wisbucky 받아 들여진 대답 을 엉망으로 만들지 않는 것 같습니다 . 내가 무엇을 놓치고 있습니까?
ruffin

@ruffin, 예 : run.bat ""로 잡히지 않습니다 [%1]==[].
wisbucky


2

이것은 다른 답변과 동일하지만 하나의 레이블 만 사용하고 사용법을 먼저 표시하므로 추가로 일반적으로 맨 위에 배치되는 스크립트의 일종의 문서로 사용됩니다.

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

그러나 cmd / batch를 사용할 필요가 없다면 WSL 또는 powershell에서 bash를 사용하면 더 건전한 구문과 덜 신비한 기능이 있습니다.


0

"% 1"== ""가 실패하면이 버전의 모든 버전이 특정 독 문자 조건에서 실패합니다. 정의 된 경우 또는 정의되지 않은 경우에만 안전합니다.


if [not] defined ...같은 매개 변수와 함께 작동하지 않습니다 %1. if "%~1" ...작동하지 않는 예가 있습니까?
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.