При попытке запустить пакетный файл с помощью команды 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.
Командные блоки не работают с командой call. Перенаправление с помощью & | <> также не работает так, как ожидалось.
Ссылка Использование скобок для группировки выражений:
Скобки можно использовать для разделения команд на несколько строк. Это может сделать код более читабельным. Переменные будут оцениваться для блока кода так же, как если бы команда была одной строкой.
(command) ( command command )
Пример
ЕСЛИ СУЩЕСТВУЕТ C:\pagefile.sys (ECHO файл подкачки найден на диске C:)
Если команда помещается на одной строке, то скобки можно опустить.
Внутри блока вызова имеется следующий блок команд:
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
...
Команда GOTO внутри блока кода в скобках нарушит контекст скобок и вызовет ошибки. GOTO также нарушит цикл For-Do.
Я считаю, call
что работает как goto
. Так что (
... call...
... )
может быть ваша проблема.
Почему бы вам не создать OrdinalToDate
отдельный пакетный файл?