當我嘗試使用 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 的位置。
命令塊不能與呼叫命令一起使用。使用 & | 重定向<> 也無法如預期般運作。
括號可用於將命令拆分為多行。這可以使程式碼更具可讀性。將對程式碼區塊的變數進行評估,就像命令是單行一樣。
(command) ( command command )
例子
IF EXIST C:\pagefile.sys(在 C: 磁碟機上找到 ECHO 頁面檔案)
如果該指令適合一行,則可以省略括號
您的呼叫區塊中有以下命令區塊:
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
…
括號內的程式碼區塊內的 GOTO 指令將破壞括號上下文並導致錯誤。 GOTO 也將打破 For-Do 循環。
我相信call
工作原理就像goto
.所以(
……call...
可能)
是你的問題。
為什麼不製作OrdinalToDate
一個單獨的批次檔?