批处理文件错误

批处理文件错误

当我尝试使用 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一个单独的批处理文件?

相关内容