现在的位置: 首页 > 综合 > 正文

setenv_base.cmd文件的修正

2013年10月02日 ⁄ 综合 ⁄ 共 2761字 ⁄ 字号 评论关闭

//=====================================================================
//TITLE:
//    setenv_base.cmd文件的修正
//AUTHOR:
//    norains
//DATE:
//    Friday  17-September-2010
//Environment:
//    NULL
//=====================================================================

    Porting Kit下面有针对不同编译环境的命令文件,如果使用MDK的话,那么有setenv_MDK3.1.cmd和setenv_MDK3.80a.cmd这两个文件选择。文件名末尾的是相对应的MDK版本,那如果装的是MDK 4.0,没有setenv_MDK4.0.cmd,那应该怎么办呢?其实可以选择setenv_MDK3.80a.cmd来进行替代。原因很简单,我们先查看一下setenv_MDK3.80a.cmd文档。

 

    该文档的内容很简单,主要的语句是:setenv_base.cmd MDK3.80a PORT %*。意义很清楚,仅仅是调用了另外一个文件setenv_base.cmd而已。那么,我们接下来就是看看这个setenv_base.cmd。仔细查看一下会发现,批处理文件首先无论是3.8还是3.1,都是设置相同的环境变量:

 

    IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1"   CALL :SET_MDK_VARS
    IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS

 

    唯一的区别只是这几行:

 

    if "%COMPILER_TOOL_VERSION%"=="MDK3.1" (
        set RVCT31BIN=%MDK_TOOL_PATH%/ARM/BIN31
    ) ELSE (   
        set RVCT31BIN=%MDK_TOOL_PATH%/ARM/BIN40
    )

 

    很明显看出来,3.1和3.8的最大区别只是在于工具所处的文件夹名不同,3.1的是BIN31,而3.8的是BIN40,恰好MDK 4.0的工具也是位于BIN40,这也就是为什么可以采用setenv_MDK3.80a.cmd这个bat文件来对MDK4.0来进行设置的原因。其实如果以后MDK的工具路径有变更,而微软又没有发布相应的bat文件,那么可以在此进行更改。

 

     不过,这个setenv_base.cmd文件微软并没有编写得非常好,如果Porting Kit的安装目录有空格的话,比如:“D:/Program Files/Microsoft .NET Micro Framework/v4.1/Porting Kit”,那么批处理命令就会执行出错,提示如下:‘D:/Program’不是内部或外部命令,也不是可运行的程序或批处理命令。

 

     截图如下所示:


 

     这个问题是因为微软写批处理命令没有考虑到空格的缘故,要修正错误其实很简单,将第30行的这句:

 

     CALL %~dp0/tools/scripts/init.cmd

 

     两端加上双引号即可,即:

 

     "CALL %~dp0/tools/scripts/init.cmd"

 

     当然咯,这样加上去之后,会产生一个有趣的问题。比如port kiting装在D盘,正常来说,目录应该是:

 

     D:/Program files/port kiting/tools/scripts/init.cmd

 

     但按如上批处理的写法,目录会变成这样:

 

     D:/Program files/port kiting//tools/scripts/init.cmd

 

     仔细观察的话,在tools前面会多一个斜杠。不过,系统会自动将两个斜杠当成一个对待,所以还是能正常调用批处理文件。

 如果想要完美,之前的那批处理语句应该变成:

 

     "CALL %~dp0tools/scripts/init.cmd"

 

     不过这样虽然是完美了,但%~dp0和tools却混杂在了一起,不利于人的观看。反正多一个斜杠对系统而言都是一样的,建议还是改成之前的写法,至少我们人看着舒坦,要操心的就让机器去操心吧。

 

    说了那么多,那这个setenv_MDK3.80a.cmd应该怎么使用呢?叶帆的文章说直接在命令行输入setenv_MDK3.80a.cmd(见http://blog.csdn.net/yefanqiu/archive/2010/01/01/5117554.aspx的第4点),但这不一定符合我们系统的要求。因为直接点击的话,那么默认的路径为c:/keil/arm,如果要MDK的路径不是安装在这个目录,那么应该是这样调用,如:

 

     setenv_MDK3.80a.cmd d:/ Keil/ARM

 

     看起来很简单,那是因为路径没有空格。如果MDK的安装目录带有空格,那就很郁闷了,比如路径是D:/Program Files/Keil文件夹下,如果你是直接这么调用的话:

 

    setenv_MDK3.80a.cmd d:/Program Files/Keil/ARM

 

     那么很遗憾,系统会提示错误:

 

    Error - Invalid argument.  Usage: setenv.cmd MDK_TOOL_PATH 
    Example:  setenv.cmd c:/Keil/ARM

 

    其对应的截图如下所示: 

    那么,我们可不可以将路径用””来括起来呢?加入我们输入的指令更改如下:

 

    setenv_MDK3.80a.cmd "d:/Program Files/Keil/ARM"

 

    那么还是会有错,只不过提示错误变成:

 

    ‘D:/Program’不是内部或外部命令,也不是可运行的程序或批处理命令

 

    除此以外,还有另外一个:

    此时不应有 Files/Keil/ARM ""=""

 

    其对应的截图如下所示:
 

 

    这个错误产生的原因是因为windows将括号也当成形参传递给了批处理命令。但如果不用括号,因为有空格,所以windows又会认为它是两个形参。

 

    解决方法很简单,我们看看setenv_base.cmd文件的第22行:

 

    SET ARG3=%3

 

    将它更改为:

 

    SET ARG3=%~3

 

    该语句的意思是,如果有两侧有"的话,会自动除去;如果不存在,则维持原有的字符串。

【上篇】
【下篇】

抱歉!评论已关闭.