【问题标题】:For loops in a batch file批处理文件中的for循环
【发布时间】:2015-12-28 20:54:03
【问题描述】:

我正在使用批处理文件来转换许多气候文件 (*.nc) 的数据类型。我使用 for 循环遍历文件。但是,由于某种原因,它无法正常工作。

这是我的代码:

@echo off

for /l %%x in (2071,1,2100) do (
pause
    C:\NCO\ncap2 -s prec=float(prec) Prec_Order_%%x.nc Prec_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tavg=float(Tavg) Tavg_Order_%%x.nc Tavg_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tmax=float(Tmax) Tmax_Order_%%x.nc Tmax_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tmin=float(Tmin) Tmin_Order_%%x.nc Tmin_Order_F_%%x.nc
    C:\NCO\ncap2 -s Wspd=float(Wspd) Wspd_Order_%%x.nc Wspd_Order_F_%%x.nc
    C:\NCO\ncap2 -s Srad=float(Srad) Srad_Order_%%x.nc Srad_Order_F_%%x.nc
    C:\NCO\ncap2 -s Hspec=float(Hspec) Hspec_Order_%%x.nc  Hspec_Order_F_%%x.nc
    )

pause

程序在第一次暂停时不起作用。我已经仔细检查过,但找不到问题出在“for /l %%x in (2071,1,2100) do (”这一行。

【问题讨论】:

  • 我猜你需要在ncap2命令行中转义所有),也就是说,在它们前面加上^;对于(,不需要这样的东西......

标签: batch-file for-loop


【解决方案1】:

很可能,ncap2 命令行中的第一个右括号 ) 被解释为整个 for /L 循环的右括号,因此您的代码将失败。

要克服这个问题,您需要转义循环体中所有关闭的)。在cmd 中转义意味着在字符前面加上^。开头( 不需要转义,但也无害;我更喜欢这样做主要是出于美观的原因(这样人们就可以很容易地将它们与功能性( 区分开来)。

这里是固定代码:

for /l %%x in (2071,1,2100) do (
    pause
    C:\NCO\ncap2 -s prec=float^(prec^) Prec_Order_%%x.nc Prec_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tavg=float^(Tavg^) Tavg_Order_%%x.nc Tavg_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tmax=float^(Tmax^) Tmax_Order_%%x.nc Tmax_Order_F_%%x.nc
    C:\NCO\ncap2 -s Tmin=float^(Tmin^) Tmin_Order_%%x.nc Tmin_Order_F_%%x.nc
    C:\NCO\ncap2 -s Wspd=float^(Wspd^) Wspd_Order_%%x.nc Wspd_Order_F_%%x.nc
    C:\NCO\ncap2 -s Srad=float^(Srad^) Srad_Order_%%x.nc Srad_Order_F_%%x.nc
    C:\NCO\ncap2 -s Hspec=float^(Hspec^) Hspec_Order_%%x.nc  Hspec_Order_F_%%x.nc
)
pause

【讨论】:

  • 我对这两个答案都投了赞成票,因为它们都运作良好。谢谢大家。
【解决方案2】:

在我看来,编写for 循环的最佳方法是调用子例程,如下例所示。这避免了所有括号问题。

for /L %%x in (2071,1,2100) do call :sp1 %%x
echo "done"
pause
goto :eof

:sp1
set arg=%1
echo arg = %arg%
C:\NCO\ncap2 -s prec=float(prec) Prec_Order_%arg%.nc Prec_Order_F_%arg%.nc
...
goto :eof

【讨论】:

  • 如果您不关心速度,这是一个很好的解决方法。该脚本将在没有 CALL 并且只转义右括号的情况下运行得更快。
  • @Squashman 好吧,如果您担心速度,就不要使用 bat 文件...根据我的经验,子程序调用的开销并不明显。
  • 真的取决于你在做什么。 BAT 文件可能非常有效,具体取决于它们正在完成的任务。读取大文件之类的事情可能效率很低。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2023-03-27
  • 2011-10-07
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多