Batchdateifehler

Batchdateifehler

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, calles funktioniert so goto. Also (... call...... )könnte Ihr Problem sein.

Warum erstellen Sie keine OrdinalToDateseparate Batchdatei?

verwandte Informationen