How to put double quotes in VS2010 post build step

2019-01-23 05:07发布

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?

6条回答
一纸荒年 Trace。
2楼-- · 2019-01-23 05:33

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.

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-01-23 05:43

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.

查看更多
太酷不给撩
4楼-- · 2019-01-23 05:44

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.

查看更多
放荡不羁爱自由
5楼-- · 2019-01-23 05:47

I couldn't get the other answers to work.

I finally just escaped the last "\":

"$(TargetDir)\"
查看更多
聊天终结者
6楼-- · 2019-01-23 05:57

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\"""

查看更多
迷人小祖宗
7楼-- · 2019-01-23 05:59

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.

查看更多
登录 后发表回答