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.
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\"""
请不要使用构建后事件。
相反,请使用 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 目标由托管代码运行,这确保了更稳健的执行、更好的可维护性和可追溯性。
我无法获得其他答案。
我终于逃脱了最后一个“ \”:
"$(TargetDir)\"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9650 次 |
| 最近记录: |