17

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

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

我也单独尝试过\"""但这两者都会导致 2 个字符的转义序列出现在回显的命令行中?如何在构建步骤中正确地转义双引号?

4

7 回答 7

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 "

这行得通。我在使用 Visual Studio Shell 的 AVR Studio 6.1 中对此进行了测试。

于 2013-07-23T17:46:46.353 回答
9

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

MSDN 有关于如何在项目文件中使用保留的 XML 字符的参考。在您的示例中,完成副本所需要做的就是在 .csproj/.vbproj 文件中:

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

这会将两条路径都用双引号引起来。引用带空格的路径时会出错,这就是需要双引号的原因。

于 2013-10-15T18:48:33.590 回答
6

您需要在两个双引号内加上一个双引号。

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

于 2012-08-17T15:03:39.210 回答
6

我无法得到其他答案。

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

"$(TargetDir)\"
于 2015-02-11T12:09:55.020 回答
5

请,哦,请不要使用后期构建事件。
相反,请使用 MSBuildAfterBuild目标的强大功能:

右键单击您的项目并选择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 目标由托管代码运行,这确保了更健壮的执行、更好的可维护性和可追溯性。

于 2012-07-23T21:20:26.427 回答
1

可以像这样将尾部与\尾部分开:".

"$(TargetDir)."

just 表示“.当前目录”(而不是..表示“当前目录上一级的目录”);在这个问题也袭击我之前,我从来没有真正使用过它!

于 2019-10-25T12:50:58.117 回答
0

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

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

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

于 2018-04-23T08:26:39.420 回答