Windows 배치 파일에서 파일 이름의 일부 비교

Windows 배치 파일에서 파일 이름의 일부 비교

다음 스크립트를 고려해보세요.

SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
 if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ ) 
ENDLOCAL

다음과 같이 호출됨thisscript 11111.9100.csv

내가하고 싶은 일은 파일 이름의 두 번째 세그먼트 (9100)를 기준으로 파일을 올바른 폴더로 이동하는 것입니다. 따라서 9200보다 크면 한 폴더로 이동하고 그렇지 않으면 다른 폴더로 이동하십시오. .

문제는 비교가 안되는 것 같습니다.

답변1

Dennis는 한 가지 문제를 식별하고 답변을 통해 해결책을 제시했습니다. 그러나 여전히 다른 문제가 있습니다.

1) 코드에는 set partial_name = %%G변수 이름의 후행 공백과 값의 선행 공백이 포함됩니다. 코드는 읽어야합니다set partial_name=%%G

2) 값이 이미 인용되어 있을 수 있습니다. 이 경우 값 대신 를 %1사용하여 자신의 값을 추가하기 전에 인용 부호를 제거해야 합니다 ."%~1""%1"

3) 귀하의 경우에는 문제가 되지 않을 수도 있지만 일반적으로 이름에 공백이나 특수 문자가 포함된 경우 파일 경로를 따옴표로 묶는 것이 좋습니다.

4) 숫자 비교를 원한다고 가정합니다. IF 명령은 숫자 구문 분석을 시도할 때 SET /A 명령과 거의 동일한 규칙을 사용합니다. 접두사가 0인 숫자는 16진수 표기법으로 처리됩니다. 8 또는 9와 같은 유효하지 않은 16진수를 찾으면 IF는 숫자 비교 대신 문자열 비교로 되돌아갑니다.

예를 if 09 lss 8 (echo true) else echo false들어 true.

따라서 파일 이름의 두 번째 세그먼트에 앞에 0이 포함될 가능성이 있는 경우 추가 작업을 수행해야 합니다.

set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
  for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
  if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
  move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
  move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)

답변2

실제로 변수의 내용이 아니라 문자열을 partial_name와 비교하고 있습니다.9100

이므로 p GEQ 9이는 true로 평가됩니다.

또한 (후행 및 선행 공백 참고) 로 set partial_name = %%G설정됩니다 .partial_name  %%G

이 두 가지 문제를 모두 해결하려면 변수 이름을 백분율 기호( %)로 묶고 eual 기호( =) 주위의 공백을 제거합니다.

for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
 if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )

관련 정보