Как поместить двойные кавычки на этапе сборки VS2010

Я пытаюсь создать шаг копирования файла post build в VS2010, который обрабатывает макросы пути, когда у них есть встроенные пространства. Я попытался окружить команды копирования в двойных кавычках, но я получаю сообщение об ошибке, когда вызывается копия, если $(SolutionDir) содержит пробел. эхо-команда в сообщении об ошибке не отображает двойные кавычки.

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

Я также пробовал отдельно \" и "", но оба они приводят к тому, что в эхо-команде будет отображаться escape-последовательность из 2 символов? Как правильно избежать двойной цитаты на этапе сборки?

Ответы

Ответ 1

У меня возникли проблемы с использованием двойных кавычек с командой события pre-build в 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.

Ответ 2

Вам нужно поставить двойную кавычку в две двойные кавычки.

Пример файла копии на этапе пост-сборки: copy /Y """C:\source path with spaces\somefile.txt""" """C:\destination path with spaces\"""

Ответ 3

Файлы проекта Visual Studio являются файлами XML. Некоторые специальные символы, такие как двойная кавычка, должны быть экранированы с использованием названных объектов. Я думаю, что они похожи на то, что используется для кодирования строк в html.

В MSDN есть ссылка на Как использовать зарезервированные символы XML в файлах проектов. В вашем примере все, что вам нужно сделать для выполнения вашей копии, это в файле .csproj/.vbproj:

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

Это обернет оба пути в двойные кавычки. При ссылках на пути с пробелами вы получите ошибки, и почему нужны двойные кавычки.

Ответ 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>

В отличие от PostBuildEvent, который выполняется с помощью raw cmd.exe, целевые объекты BeforeBuild/AfterBuild запускаются управляемым кодом, что обеспечивает более надежное выполнение, улучшенную поддержку и отслеживаемость.

Ответ 5

Я не мог заставить другие ответы работать.

Я, наконец, просто избежал последнего "\":

"$(TargetDir)\"