Когда я пытался запустить командный файл с помощью команды gdal_calculate. Возникает следующая ошибка:

  • batfile не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
  • Ошибка RuntimeError: D:\Sample\sample_file_.tif 'не существует в файловой системе и не распознается как имя поддерживаемого набора данных.
  • Ошибка выполнения: D:\Sample\sample_file_!Месяц! .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 ответ1

1

Ссылочный звонок

ВЫЗВАТЬ подпрограмму (: метка)

Команда 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 )

пример

ЕСЛИ EXIST 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 отдельным командным файлом?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .