Beim Versuch, eine Batchdatei mit dem Befehl gdal_calculate auszuführen, tritt der folgende Fehler auf:
- Die Batfile-Datei wird nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt.
- RuntimeError: „D:\Sample\sample_file_.tif“ existiert nicht im Dateisystem und wird nicht als unterstützter Datensatzname erkannt.
- RuntimeError: „D:\Sample\sample_file_!Month!.tif“ ist im Dateisystem nicht vorhanden und wird nicht als unterstützter Datensatzname erkannt.
Darf gdal_calculate nicht im Batch-Prozess verwendet werden? Irgendeine Idee?
Hier ist das Skript, das ich verwende:
@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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Antwort1
Referenz Anruf
Rufen Sie eine Subroutine auf (:label)
Der CALL-Befehl übergibt die Steuerung an die Anweisung nach dem angegebenen Label zusammen mit den angegebenen Parametern. Um die Subroutine zu verlassen, geben Sie GOTO:eof ein. Dadurch wird die Steuerung an das Ende der aktuellen Subroutine übertragen.
Ein Label wird durch einen einzelnen Doppelpunkt gefolgt von einem Namen definiert. Dies ist die Grundlage einer Batchdateifunktion.
CALL :sub_display 123 CALL :sub_display 456 ECHO All Done GOTO :eof :sub_display ECHO The result is %1 GOTO :eof
Am Ende der Subroutine kehrt GOTO:eof an die Position zurück, an der Sie CALL verwendet haben.
Befehlsblöcke funktionieren nicht mit dem Aufrufbefehl. Auch die Umleitung mit & | <> funktioniert nicht wie erwartet.
Referenz Verwenden von Klammern zum Gruppieren von Ausdrücken:
Mit Klammern können Befehle auf mehrere Zeilen aufgeteilt werden. Dadurch wird der Code lesbarer. Variablen werden für den Codeblock genauso ausgewertet, als wäre der Befehl eine einzelne Zeile.
(command) ( command command )
Beispiel
WENN EXISTIERT: C:\pagefile.sys (ECHO-Auslagerungsdatei auf Laufwerk C: gefunden)
Wenn der Befehl in eine einzige Zeile passt, kann die Klammer weggelassen werden
Sie haben den folgenden Befehlsblock in Ihrem Aufrufblock:
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
...
Ein GOTO-Befehl innerhalb eines Codeblocks in Klammern unterbricht den Klammerkontext und verursacht Fehler. Ein GOTO unterbricht auch eine For-Do-Schleife.
Ich glaube, call
es funktioniert so goto
. Also (
... call...
... )
könnte Ihr Problem sein.
Warum erstellen Sie keine OrdinalToDate
separate Batchdatei?