배치 파일 오류

배치 파일 오류

gdal_calculate 명령을 사용하여 배치 파일을 실행하려고 할 때. 다음 오류가 발생합니다.

  • batfile은 내부 또는 외부 명령, 실행 가능한 프로그램, 배치 파일로 인식되지 않습니다.
  • RuntimeError: D:\Sample\sample_file_.tif'는 파일 시스템에 존재하지 않으며 지원되는 데이터 세트 이름으로 인식되지 않습니다.
  • RuntimeError: D:\Sample\sample_file_!Month!.tif'가 파일 시스템에 존재하지 않으며 지원되는 데이터 세트 이름으로 인식되지 않습니다.

gdal_calculate를 일괄 처리에서 사용할 수 없습니까? 어떤 아이디어?

내가 사용하는 스크립트는 다음과 같습니다.

@echo off
setlocal enabledelayedexpansion

set "in_path=D:\Input"
set "out_path=D:\Output"
set "sample_path=D:\Sample"
set "proc_path=D:\Processed_Files"

md %out_path% 
md %proc_path%
cd /d "%in_path%"

for /f "delims=" %%a in ('dir /b /on ????????*.tif ') do (
set "year=%%~na"
set "daynum=!year:~5,3!"
set "year=!year:~1,4!"

call ordinal.bat !year! !daynum! yy month dd
echo %%a matches to !yy!-!month!-!dd!

if !Month!==01 set Month=jan
if !Month!==02 set Month=feb
if !Month!==03 set Month=mar
if !Month!==04 set Month=apr
if !Month!==05 set Month=may
if !Month!==06 set Month=jun
if !Month!==07 set Month=jul
if !Month!==08 set Month=aug
if !Month!==09 set Month=sep
if !Month!==10 set Month=oct
if !Month!==11 set Month=nov
if !Month!==12 set Month=dec

gdal_calculate --out=%out_path%\%%a --calc="((image1-image2))" --image2=%sample_path%\sample_file_!Month!.tif --image1=%in_path%\%%a --extent=INTERSECT

)
echo done
goto :EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ordinal %year% %doy% yy mm dd
::
:: By:   Ritchie Lawrence, 2002-09-29. Version 1.0
::
:: Func: Returns a calendar date from an ISO 8601 Ordinal date.
::       For NT4/2K/XP.
:: 
:: Args: %1 year component to be converted, 4 digits (by val)
::       %2 day of year component to be converted, 001 to 366 (by val)
::       %3 var to receive year, 4 digits (by ref)
::       %4 var to receive month, 2 digits, 01 to 31 (by ref)
::       %5 var to receive day of month, 01 to 31 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
for /f "tokens=1-2" %%a in ('echo/%1 %2') do set /a yy=%%a,o=1%%b%%1000
set /a z=14-1,z/=12,y=yy+4800-z,m=1+12*z-3,j=153*m+2
set /a j=j/5+1+y*365+y/4-y/100+y/400-2432046,j+=o-1
set /a a=j+2432045,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %3=%yy%&set %4=%mm%&set %5=%dd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

답변1

참조 부르다

서브루틴 호출(:label)

CALL 명령은 지정된 매개변수와 함께 지정된 레이블 뒤의 명령문에 제어를 전달합니다. 서브루틴을 종료하려면 GOTO:eof를 지정하십시오. 이렇게 하면 현재 서브루틴의 끝으로 제어가 전송됩니다.

레이블은 단일 콜론과 이름으로 정의됩니다. 이것이 배치 파일 기능의 기초입니다.

CALL :sub_display 123
CALL :sub_display 456
ECHO All Done
GOTO :eof

:sub_display
ECHO The result is %1
GOTO :eof

서브루틴이 끝나면 GOTO :eof는 CALL을 사용한 위치로 돌아갑니다.

명령 블록은 호출 명령과 함께 작동하지 않습니다. &를 사용한 리디렉션 | <>도 예상대로 작동하지 않습니다.

참조 괄호/괄호를 사용하여 표현식 그룹화:

괄호를 사용하여 명령을 여러 줄로 나눌 수 있습니다. 이렇게 하면 코드를 더 읽기 쉽게 만들 수 있습니다. 명령이 한 줄인 것처럼 코드 블록에 대한 변수가 평가됩니다.

  (command)

  (
    command
    command )

존재하는 경우 C:\pagefile.sys(C: 드라이브에 있는 ECHO 페이지 파일)

명령이 한 줄에 들어갈 경우 괄호를 생략할 수 있습니다.

호출 블록 내에 다음 명령 블록이 있습니다.

(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)

...

괄호로 묶인 코드 블록 내의 GOTO 명령은 괄호 컨텍스트를 깨뜨리고 오류를 발생시킵니다. GOTO는 For-Do 루프도 중단시킵니다.

나는 .callgoto그래서 (... call...... )당신의 문제일 수 있습니다.

OrdinalToDate별도의 배치 파일을 만들어 보는 것은 어떨까요 ?

관련 정보