error de archivo por lotes

error de archivo por lotes

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 callfunciona como goto. Entonces (... call...... )podría ser tu problema.

¿Por qué no creas OrdinalToDateun archivo por lotes separado?

información relacionada