如何在VS2010后期构建步骤中加双引号

Jon*_*onN 16 msbuild macros build quoting visual-studio-2010

我正在尝试在VS2010中创建一个后期构建文件复制步骤,它在嵌入空格时处理路径宏.我试过用双引号括起复制命令,但是如果$(SolutionDir)包含空格则调用copy时会出错.错误消息中的回显命令行不显示双引号.

copy "$(SolutionDir)$(Configuration)\*" "$(TargetDir)"

我也单独尝试\",""但这两个导致2字符转义序列出现在echoed命令行?如何在构建步骤中正确地逃避双引号?

Set*_*eth 12

我在Visual Studio中使用双引号和预构建事件命令时遇到了问题.我已经看到了这个问题的批处理文件解决方案,但似乎批处理文件不会解决所有问题并且不优雅. 我发现解决方案是在结束双引号之前放置一个空格. 详情如下所示.

以下命令有效,但不支持路径中的空格:

subwcrev $(SolutionDir) $(SolutionDir)subwcrev_template.txt $(SolutionDir)version.h

我几乎无法控制其他开发人员放置解决方案的位置,所以我不得不支持路径中的空格.试图在路径周围使用引号来支持空格,我想出了以下命令.它总是失败.

subwcrev "$(SolutionDir)" "$(SolutionDir)subwcrev_template.txt" "$(SolutionDir)version.h"

几乎是偶然的,我找到了解决方案,在路径的最后一个字符和双引号之间放了一个空格.

subwcrev "$(SolutionDir) " "$(SolutionDir)subwcrev_template.txt " "$(SolutionDir)version.h "

这很有效.我在AVR Studio 6.1中测试了这个,它使用Visual Studio Shell.

  • 这是因为“$(SolutionDir)”解析为“某个文件夹”,从而转义了您的引用;不过 `"$(SolutionDir)\"` 可以工作。 (3认同)

Jef*_*Fay 7

Visual Studio项目文件是XML文件.某些特殊字符(如双引号)必须使用命名实体进行转义.我认为它们类似于用于将字符串编码为html的内容.

MSDN引用了如何在项目文件中使用保留的XML字符.在您的示例中,您需要做的就是完成您的副本,这是在.csproj/.vbproj文件中:

copy "$(SolutionDir)$(Configuration)\*" "$(TargetDir)"
Run Code Online (Sandbox Code Playgroud)

这将用双引号包装两个路径.引用带空格的路径时会出错,这就是需要双引号的原因.


小智 6

你需要在两个双引号内加一个双引号.

后期构建步骤中的复制文件示例: copy /Y """C:\source path with spaces\somefile.txt""" """C:\destination path with spaces\"""


KMo*_*raz 5

请不要使用构建后事件。
相反,请使用 MSBuild 目标的强大功能AfterBuild

右键单击您的项目并选择Edit Project File。添加 AfterBuild 事件:

  <Target Name="AfterBuild">
    <ItemGroup>
      <FilesToCopy Include="$(SolutionDir)$(Configuration)\*" />
    </ItemGroup>
    <Copy SourceFiles="@(FilesToCopy)"
          DestinationFolder="$(TargetDir)"
          OverwriteReadOnlyFiles="true" SkipUnchangedFiles="false" Condition="'@(FilesToCopy)' != ''" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

与由原始 cmd.exe 执行的 PostBuildEvent 不同,BeforeBuild/AfterBuild 目标由托管代码运行,这确保了更稳健的执行、更好的可维护性和可追溯性。

  • 那么 `%22$(SolutionDir)%22` 将变成 `"C:\Path With Spaces\src"`。对于上面的示例,您不需要转义空格,因为“复制”任务会处理它。 (2认同)
  • 您还可以在 XML 中使用 `" 转义引号 (`"`) (2认同)

Ric*_*ove 5

我无法获得其他答案。

我终于逃脱了最后一个“ \”:

"$(TargetDir)\"
Run Code Online (Sandbox Code Playgroud)

  • 我无法理解转义双引号的原因,但它有效。 (2认同)
  • 很少有情况是,我们软件开发人员仅仅因为某件事有效就必须做某事。没有任何逻辑原因,它会让你感到肮脏​​。但在这种情况下,这是由于设计限制(也称为错误)。希望微软将来能解决这个问题。 (2认同)
  • @Ali \ 不是转义双引号,而是从 $(TargetDir) 中取消转义前面的尾随 \ ,这样它就不会被解释为双引号的转义字符本身,而是被解释为正常的独立反斜杠。 (2认同)