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

时间:2012-07-20 21:50:39

标签: visual-studio-2010 build msbuild macros quoting

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

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

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

7 个答案:

答案 0 :(得分: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。

答案 1 :(得分:6)

你需要在两个双引号中加上双引号。

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

答案 2 :(得分:6)

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

MSDN在How To Use Reserved XML Characters in Project Files上有引用。在您的示例中,您需要做的就是在.csproj / .vbproj文件中执行此操作:

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

这将用双引号将两个路径包装起来。在引用带空格的路径时会出现错误,这就是需要双引号的原因。

答案 3 :(得分:4)

不要 使用帖子构建活动。
相反,使用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>

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

答案 4 :(得分:4)

我无法得到其他工作的答案。

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

"$(TargetDir)\"

答案 5 :(得分:0)

我有另一种情况。使用包含带空格的路径的两个参数在Solution Dir中运行工具。这是我的解决方案:

"$(SolutionDir)Tool.exe" --solution-dir "$(SolutionDir)\" --project-dir "$(ProjectDir)\"

在inital命令中加上双引号,在所有路径上使用双引号,并在每条路径的最后一个双引号之前使用反斜杠。

答案 6 :(得分:0)

可以使用\将结尾的".分开,像这样:

"$(TargetDir)."

.仅表示“当前目录”(而..则表示“距当前目录上一级的目录”);直到这个问题困扰我之前,我从未真正使用过它!