I'm trying to create a post build file copy step in VS2010 which handles path macros when they have embedded spaces. I've tried surrounding the copy commands in double quotes but I get error from when copy is invoked if $(SolutionDir)
contains a space. the echoed command line in the error message does not show the double quotes.
copy "$(SolutionDir)$(Configuration)\*" "$(TargetDir)"
I also tried separately \"
and ""
but both of these cause the 2 character escape sequence to appear in the echoed command line? How does one properly escape a double quote in a build step?
I was having trouble using double quotes with a pre-build event command in Visual Studio. I have seen the batch file solutions to this problem, but it seems a batch file would not solve all problems and is not elegant. I found the solution was to put a space before the closing double quote. The details are as follows.
The following command worked, but would not support spaces in the path:
subwcrev $(SolutionDir) $(SolutionDir)subwcrev_template.txt $(SolutionDir)version.h
I have little control over where other developers will place the solution, so I had to support spaces in the path. Trying to use quotes around paths to support spaces, I came up with the following command. It always fails.
subwcrev "$(SolutionDir)" "$(SolutionDir)subwcrev_template.txt" "$(SolutionDir)version.h"
Almost by accident, I found the solution, put a space between the last character of the path and the double quote.
subwcrev "$(SolutionDir) " "$(SolutionDir)subwcrev_template.txt " "$(SolutionDir)version.h "
This worked. I tested this in AVR Studio 6.1, which uses a Visual Studio Shell.
You need to put a double quote within two double quotes.
Example of a copy file in a post build step:
copy /Y """C:\source path with spaces\somefile.txt""" """C:\destination path with spaces\"""
Visual Studio project files are XML files. Some special characters, such as the double quote, have to be escaped by using named entities. I think they're similar to what's used for encoding strings to html.
MSDN has a reference on How To Use Reserved XML Characters in Project Files. In your example, all you would need to do to accomplish your copy is this in the .csproj/.vbproj file:
copy "$(SolutionDir)$(Configuration)\*" "$(TargetDir)"
That will wrap both paths in double quotes. You'll get errors when referencing paths with spaces and that's why the double quotes are required.
Please, oh please don't use post build events.
Instead, use the power of MSBuild's AfterBuild
target:
Right click on your project and select Edit Project File
. Add an AfterBuild event:
<Target Name="AfterBuild">
<ItemGroup>
<FilesToCopy Include="$(SolutionDir)$(Configuration)\*" />
</ItemGroup>
<Copy SourceFiles="@(FilesToCopy)"
DestinationFolder="$(TargetDir)"
OverwriteReadOnlyFiles="true" SkipUnchangedFiles="false" Condition="'@(FilesToCopy)' != ''" />
</Target>
Unlike the PostBuildEvent which executes by raw cmd.exe, BeforeBuild/AfterBuild targets run by managed code, which ensures more robust execution, better maintainability and traceability.
I couldn't get the other answers to work.
I finally just escaped the last "\":
"$(TargetDir)\"
I had another situation. Running a tool inside the Solution Dir with two parameters containing paths with spaces. This was my solution:
"$(SolutionDir)Tool.exe" --solution-dir "$(SolutionDir)\" --project-dir "$(ProjectDir)\"
Put double quotes on the inital command, use double quotes on all paths AND use a backslash before the last double quote of each path.
来源:https://stackoverflow.com/questions/11587394/how-to-put-double-quotes-in-vs2010-post-build-step