代码之家  ›  专栏  ›  技术社区  ›  Oliver Salzburg

Visual Studio生成事件中的空格和反斜杠

  •  3
  • Oliver Salzburg  · 技术社区  · 15 年前

    我有一个应用程序,应该在构建前和构建后事件处理方面帮助我的项目。我正在使用ndesk.options进行命令行参数解析。当我的项目路径包含空格时,它给了我奇怪的结果。我认为这是ndesk.options的错误,但我想应该怪我自己的申请。我将我的应用程序称为后期构建事件,如下所示:

    build.exe --in="$(ProjectDir)" --out="c:\out\"
    

    简单的foreach over args[]显示以下内容:

    --in=c:\my project" --out=c:\out"
    

    所发生的是,每个参数中的最后一个“被视为是被转义的”。因此删除了后面的反斜杠。整个事情被当作一个单一的论点。

    现在我觉得我很聪明,只是简单地逃避了第一个“同样,就像这样:

    build.exe --in=\"$(ProjectDir)" --out=\"c:\out\"
    

    在这种情况下,生成的args[]如下所示:

    --path="c:\my
    project"
    --out="c:\out"
    

    参数中的尾随反斜杠仍然被忽略,第一个参数现在被拆分。

    将此参数[]传递给ndesk.options将产生错误的结果。

    正确的命令行的外观应该如何使正确的元素最终出现在正确的args[]插槽中?或者,如何使用或不使用ndesk.options来解析这些命令行参数?欢迎提出任何建议。

    提前谢谢

    2 回复  |  直到 8 年前
        1
  •  8
  •   tanascius    15 年前

    你试图避开最后一个反斜杠了吗?

    build.exe --in="$(ProjectDir)\" --out="c:\out\\"
    

    这可能只起作用,只要 ProjectDir 结束于 \ ,应该是 given .
    这只是个主意,但我没试过。

    编辑:
    我发现了一个 comment 这就意味着要去掉尾随 "

        2
  •  1
  •   G Greene    8 年前

    我实际上用“.”来解决这个问题:

    build.exe --in="$(ProjectDir)." --out="c:\out\."
    

    主要是因为如果不是这样的话,它看起来像是在试图避开第二个引号……而不是,你是在逃避最后一个引号(它是隐藏的)。 我还在postbuild命令中添加了一个rem,描述了我为什么要这样做。