배치 파일을 시작/호출 할 때 인수가 정의되었는지 확인하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/830565

  •  06-07-2019
  •  | 
  •  

문제

배치 파일에서 다음 유효성 검사 로직을 사용하려고하지만 매개 변수가 배치 파일에 제공되지 않더라도 "사용법"블록은 실행되지 않습니다.

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

@echo This should not execute

@echo Done.
goto :eof

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

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

명령 라인 인수가 설정되었는지 확인하는 것이 [%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

다른 팁

보다 진정 된 예 :

⍟ 무제한 논증.

pile 파일 시스템에 존재합니다 (또한 file 또는 directory?) 또는 제네릭 string.

⍟ 파일 인 경우를 지정하십시오

⍟ 디렉토리입니다

아니요 확장, 레거시 스크립트에서 작동합니다!

최소 코드 ☺

@echo off

:loop
      ::-------------------------- has argument ?
      if ["%~1"]==[""] (
        echo done.
        goto end
      )
      ::-------------------------- argument exist ?
      if not exist %~s1 (
        echo not exist
      ) else (
        echo exist
        if exist %~s1\NUL (
          echo is a directory
        ) else (
          echo is a file
        )
      )
      ::--------------------------
      shift
      goto loop


:end

pause

✨ 기타 물건 .. ✨

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

%~s1 - s 길을 만듭니다 DOS 8.3 naming, 이것은 물건을 확인하는 동안 파일 이름의 공간을 피하는 좋은 트릭입니다 (이런 식으로 리소스를 더 이상 랩핑 할 필요가 없습니다. "에스.

["%~1"]==[""] 인수가 파일/디렉토리이거나 일반적인 문자열이라면 "확실하지 않음"이라면 표현식은 대괄호를 사용하고 원래의 원래 수정되지 않은 것을 사용합니다. %1 (그냥없이 " 포장, 있으면 ..)

우리가 사용한 경우 논쟁이 없다면 shift 그리고 Arg-list 포인터가 마지막을 통과했으며, 표현은 다음으로 평가됩니다. [""]==[""].

■ 이것은 더 많은 트릭을 사용하지 않고 할 수있는 것만 큼 특정합니다 (Windows-95의 배치 스크립트에서도 작동합니다 ...)

■ 실행 예제

그것을 저장하십시오 identifier.cmd

무제한 인수를 식별 할 수 있습니다 (일반적으로 당신은 %1-%9), 인수를 반전 된 공동체로 랩핑하거나 8.3 명명을 사용하거나 드래그 앤 드롭 (자동으로 위의 중 하나)을 드래그 앤 드롭하는 것을 잊지 마십시오.


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

identifier.cmd c:\windows그리고 얻기 위해

exist
is a directory
done

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"그리고 얻기 위해

exist
is a file
done

⓷ 및 여러 인수 (물론 이것은 온통 ..)

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

그리고 얻기 위해

exist
is a directory
exist
is a file
exist
is a file
not exist
done.

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

누군가를 돕기를 바랍니다 :)

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

다음은 APK 파일의 양 (Android 앱)을 사용하여 디버그 콘솔 (ADB.EXE)을 통해 장치에 설치하는 작업 예제입니다.이전 게시물을 ADB Install-Multi Syntax를 사용하지 않는 Mass APK 설치 프로그램으로 만듭니다.

괄호를 제거하십시오.

샘플 배치 파일 :

echo "%1"

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

if "%1"=="" echo match2

위의 스크립트 실행에서 출력 :

C:\>echo "" 
""

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

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

나는 그것이 실제로 괄호를 끈의 일부로 받아들이고 있다고 생각합니다.

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

~ %1 자체가 인용되면 %1을 제거합니다.

""전달 된 특수 캐릭터로부터 보호 할 것입니다. 예를 들어 & ping으로 스크립트를 호출합니다

IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given

"%1"== ""가 실패하면 특정 독이 특성 조건 에서이 버전이 실패합니다. 정의되었거나 정의되지 않은 경우에만 안전합니다

이것은 다른 답변과 동일하지만 하나의 레이블 만 사용하고 사용법을 먼저 넣습니다. 이는 또한 일반적으로 상단에 배치되는 스크립트를 추천하는 일종의 문서화 역할을합니다.

@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를 사용하면 더 많은 제정신 구문과 덜 비전 기능이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top