我正在使用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"
答案 0 :(得分:2)
不是检查path
变量,而是直接检查编译器是否可用
where ifort >nul 2>&1 || call "%MY_PATH%\ifortvars.bat" intel64
where
命令将搜索路径中指示的程序,如果找到它,则回显控制其路径。如果找不到该程序,它会回显错误并设置errorlevel
变量。
在代码中隐藏了where
的所有输出,将stdout
和stderr
流重定向到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;