Как поместить двойные кавычки на этапе сборки 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)\"