Windows命令行:我发现将反斜杠尾随路径作为程序参数传递是非常难的;有最好的做法吗?

时间:2016-04-09 07:44:53

标签: visual-studio batch-file cmd

我遇到了这样的问题。使用Visual Studio 2010,我想将postb.exe添加为构建后事件操作,如下所示:

postb.exe "$(SolutionDir)" "$(TargetDir)"

enter image description here

我的postb.exe是用C语言编写的,如下所示:

#include <stdio.h>

int main(int argc, char **argv)
{
    if(argc<3) {
        int i;
        printf("Need 2 params, only %d given.\n", argc-1);
        for(i=1; i<argc; i++)
            printf("  argv[%d]=%s\n", i, argv[i]);
        return 1;
    }
    printf("Your .sln dir is: %s\n", argv[1]);
    printf("Your .exe dir is: %s\n", argv[2]);
    return 0;
}

当构建后事件被触发时,我没有得到我期望的结果,如下所示:

enter image description here

我认为最致命的原因是: Microsoft Visual Studio团队决定以反斜杠终止$(Solution)$(TargetDir)然后噩梦来了:反斜杠在CMD shell字符串内部充当转义字符,因此结束引号不作为结束引号。

我认为我必须使用引号(双引号),因为$(Solution)$(TargetDir)可能包含空格。

我意识到我可以应用一些解决方法,例如,将构建后事件.bat更改为:

set var1=$(SolutionDir)
set var2=$(TargetDir)
set var1=%var1:\=/%
set var2=%var2:\=/%

postb.exe "%var1%" "%var2%"

输出变得可用:

Your .sln dir is: G:/w/test/big job/
Your .exe dir is: G:/w/test/big job/Debug/

但这令人沮丧。对于这样的问题有没有最好的做法?

1 个答案:

答案 0 :(得分:1)

如果你只想删除尾部斜杠,可以使用属性函数,它已经比批处理文件解决方案好得多了:

"$(SolutionDir.Trim('\'))"

(虽然评论说:我不认为这是你的真正的问题)