수색…


소개

이 항목에서는 배치 파일에서 수행해야하는 작업 (필수 아님) 에 중점을 둡니다. 이러한 "모범 사례"를 사용하면 배치 파일의 효과와 기능을 향상시킬 수 있습니다.

인용 부호

대부분의 온라인 배치 스크립트에는 많은 인용문 문제가 있습니다.


예제 및 솔루션

예제 A

if %var%==abc echo Test

이 코드는 작동하는데 - %var% 의 내용에 공백이나 다른 특수 문자가 포함되어 있지 않습니다. 이제 %var% 에 공백이 하나 있다고 가정 해 봅시다. 이제 cmd.exe 봅니다.

if  ==abc echo Test

cmd.exe 가이 구문을 인식하지 못하기 때문에 오류가 발생합니다.

솔루션 A

if "%var%"=="abc" echo Test

따옴표를 사용하면 cmd.exe 는 전체 %var% (공백 및 특수 문자 포함)를 하나의 일반 문자열로 간주합니다. 그러나 이것은 가장 안전한 비교 방법이 아닙니다. 가장 안전한 방법은 echo , pipefindstr 입니다.


보기 B

cd C:\User\Spaced Name\Spaced FileName.txt

cd 는 디렉토리를 C:\User\Spaced 로 변경합니다. cd 는 하나의 경로 인수 만 허용하기 때문입니다.

솔루션 B

경로 주위에 따옴표를 추가하기 만하면 문제가 해결됩니다.

cd "C:\User\Spaced Name\Spaced FileName.txt"

set /a 문과 같이 따옴표를 사용하면 더 잘 작동하는 몇 가지 예제가 있습니다. 그러나 공백이나 특수 문자가 포함 된 문자열에서 작업 할 때는 따옴표를 사용하는 것이 일반적으로 안전합니다.

스파게티 코드

스파게티 코드는 많은 경우 혼동을 일으킬 수있는 코드 스 니펫을 의미합니다. GOTO 같은 예외 및 일관성없는 코드.


예제 및 솔루션

예제 A

@echo off
set /a counter=0

:Loop
set /a counter=%counter% + 1
echo %counter%

if %counter% equ 10 goto :exit
goto :Loop

:exit

이 프로그램은 점프가 많아서 스크립트가 정확히 무엇을하는지 알기가 더 어려워졌습니다.

솔루션 A

@echo off
for /l %%G in (0,1,10) echo %%G

GOTO 를 줄이면 코드 양이 크게 줄어들었고 실제 코드에 집중할 수 있습니다.


보기 B

다음 진술을 고려하십시오.

:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie

:player1wins
echo player 1 wins
goto :eof

:player2wins
echo player 2 wins
goto :eof

:tie
echo tie
goto :eof

이 스 니펫에는 많은 goto 문이 필요하며 디버깅하기가 혼란 스러울 수 있습니다. 이러한 명령문을 단순화하기 위해 call 명령을 사용할 수 있습니다. 더 좋은 조건에서 위의 스크립트가 있습니다.

:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie

goto :eof

:message
echo %*
goto :eof

두 스크립트 모두 똑같은 결과를 출력하지만 새 스크립트는 훨씬 더 짧고 명확합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow