我正在尝试在VS2010中创建一个后期构建文件复制步骤,它在嵌入空格时处理路径宏。我试过用双引号括起复制命令,但如果$(SolutionDir)
包含空格,则会在调用复制时出错。错误消息中的回显命令行不显示双引号。
copy "$(SolutionDir)$(Configuration)\*" "$(TargetDir)"
我还单独尝试了\"
和""
,但是这两个都导致2个字符的转义序列出现在echoed命令行中?如何在构建步骤中正确地逃避双引号?
答案 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)."
.
仅表示“当前目录”(而..
则表示“距当前目录上一级的目录”);直到这个问题困扰我之前,我从未真正使用过它!