有条件地执行ifortvars.bat的批处理文件

时间:2015-06-18 00:32:44

标签: windows batch-file cmd fortran

我正在使用make.bat文件来编译我的Fortran代码。要使用ifort命令进行编译,我首先需要通过执行ifortvarsbat intel64命令来初始化编译器,其中我必须设置路径变量。

这样可以正常工作,但是,路径不断增加,并在3-4次运行后显示command too long。现在,我打开一个命令提示符,运行make.bat文件一次,然后注释ifort设置部分,这样我连续运行的make.bat不会多次设置路径。

我希望我能写一个IF ELSE命令来检查ifort命令是否执行,只设置路径并调用ifortvars(如果尚未设置)。每次打开新的命令提示符时,这都会使我免于评论和取消注释make.bat文件。

不幸的是,我对批处理脚本编写知之甚少。有人可以帮我弄这个吗。

@echo on
@echo ==============================================
@echo Setting Intel Fortran Compiler, please wait ...
@echo ==============================================

::set MY_PATH=C:\Program Files (x86)\Intel\Composer XE 2013\bin
::call "%MY_PATH%"\ifortvars.bat intel64
::call "%MY_PATH%"\ifortvars.bat ia32
@echo ==============================================
@echo Compiling program:
@echo ==============================================
:: -O3 option is used to optimize the code

ifort -O3 "Main.F90" 

2 个答案:

答案 0 :(得分:2)

不是检查path变量,而是直接检查编译器是否可用

where ifort >nul 2>&1 || call "%MY_PATH%\ifortvars.bat" intel64

where命令将搜索路径中指示的程序,如果找到它,则回显控制其路径。如果找不到该程序,它会回显错误并设置errorlevel变量。

在代码中隐藏了where的所有输出,将stdoutstderr流重定向到nul设备(>nul 2>&1),并使用条件执行。 ||运算符表示“如果前一个命令失败,则执行以下命令”

因此,如果找不到ifort,请调用配置批。

更快的解决方案可能是直接检查您在第一次配置环境时定义的“标志”变量。

if not defined FCompilerSetup (
    call "%MY_PATH%\ifortvars.bat" intel64
    set "FCompilerSetup=1"
)

note :从我的角度来看, miltonb i_am_jorf 的推荐是处理问题的正确方法。 setlocal / endlocal将删除路径问题,更清晰,更轻松。但是每次编译程序时都会调用用于设置环境的批处理文件,并且最后删除更改。如果在编译后需要对环境进行任何更改,则无法使用它。

答案 1 :(得分:0)

使用setlocal不会将您的路径更改为批处理文件的范围,因此当它再次运行时,它将再次修改路径。

在跑步前:PATH = C:\ Mypath;

setlocal
::set MY_PATH=C:\Program Files (x86)\Intel\Composer XE 2013\bin
....other lines....
endlocal

跑完后:PATH = C:\ Mypath;