Cuando intenté ejecutar un archivo por lotes usando el comando gdal_calculate. Se produce el siguiente error:
- batfile no se reconoce como un comando interno o externo, programa ejecutable o archivo por lotes.
- RuntimeError: D:\Sample\sample_file_.tif' no existe en el sistema de archivos y no se reconoce como un nombre de conjunto de datos compatible.
- RuntimeError: D:\Sample\sample_file_!Month!.tif' no existe en el sistema de archivos y no se reconoce como un nombre de conjunto de datos compatible.
¿No se permite el uso de gdal_calculate en el proceso por lotes? ¿Alguna idea?
Aquí está el script que estoy usando:
@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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Respuesta1
Referencia Llamar
LLAMAR a una subrutina (:etiqueta)
El comando CALL pasará el control a la declaración después de la etiqueta especificada junto con los parámetros especificados. Para salir de la subrutina, especifique GOTO:eof, esto transferirá el control al final de la subrutina actual.
Una etiqueta se define mediante dos puntos seguidos de un nombre. Ésta es la base de una función de archivo por lotes.
CALL :sub_display 123 CALL :sub_display 456 ECHO All Done GOTO :eof :sub_display ECHO The result is %1 GOTO :eof
Al final de la subrutina, GOTO :eof volverá a la posición donde usó CALL.
Los bloques de comando no funcionan con el comando de llamada. Redirección con & | <> tampoco funciona como se esperaba.
Referencia Usar paréntesis/corchetes para agrupar expresiones:
Los paréntesis se pueden utilizar para dividir comandos en varias líneas. Esto puede hacer que el código sea más legible. Las variables se evaluarán para el bloque de código como si el comando fuera una sola línea.
(command) ( command command )
Ejemplo
SI EXISTE C:\pagefile.sys (el archivo de paginación ECHO se encuentra en la unidad C:)
Si el comando cabe en una sola línea, entonces se puede omitir el paréntesis
Tienes el siguiente bloque de comando dentro de tu bloque de llamadas:
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
...
Un comando GOTO dentro de un bloque de código entre corchetes romperá el contexto entre paréntesis y provocará errores. Un GOTO también romperá un bucle For-Do.
Creo que call
funciona como goto
. Entonces (
... call...
... )
podría ser tu problema.
¿Por qué no creas OrdinalToDate
un archivo por lotes separado?