Разнесенные пути, msbuild и psake

Связанный вопрос здесь.

Это работает правильно для компиляции приложения MVC3.

task Compile 
{
    $config = $script:siteConfig.config

    exec { & "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" $webproject_path `
    /p:Configuration=$config /p:WebProjectOutputDir="$publish_dir" `
    /p:Outdir="$out_dir" /p:CleanWebProjectOutputDir=False `
    /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo }
}

Все эти переменные пути являются свойствами скрипта. Однако, когда в этих рассчитанных путях вводятся пробелы (например, проект перемещается из C:\Projects\ в C:\Users\ASDFG1\Documents\Visual Studio 2010\Projects), msbuild считает, что существует несколько файлов проекта. Это имеет смысл, но я должен что-то упустить, получить разобранную переменную в кавычки не должно быть так сложно.

Вариации пробовал

exec { Invoke-Expression "& C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe '$webproject_path' /p:Configuration=$config /p:WebProjectOutputDir='$publish_dir' /p:Outdir='$out_dir' /p:CleanWebProjectOutputDir=False /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo" }

exec { C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "`"$webproject_path`"" `
/p:Configuration=$config /p:WebProjectOutputDir="`"$publish_dir`"" `
/p:Outdir="`"$out_dir`"" /p:CleanWebProjectOutputDir=False `
/T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo }

1 ответ

С помощью EchoArgs.exe чтобы воспроизвести проблему, мы видим, что кавычки не передаются в исполняемый файл, как хотелось бы:

PS> $publish_dir = 'C:\Users\Documents\Visual Studio 2010\Projects'
PS> ./echoargs /p:WebProjectOutputDir="$publish_dir"
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual Studio 2010\Projects>

PS> ./echoargs /p:WebProjectOutputDir="`"$publish_dir`""
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual>
Arg 1 is <Studio>
Arg 2 is <2010\Projects>


Используя опцию обратного слэша из этого ответа, мы можем сохранить раскрытие переменной и заключенные в нее кавычки:

PS> ./echoargs /p:WebProjectOutputDir=\`"$publish_dir\`"
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects">

Здесь обратные черты говорят PowerShell обрабатывать символы кавычек как литеральные значения, а обратная косая черта говорит вызову сохранять кавычки.


В качестве альтернативы, мы могли бы придерживаться одного уровня экранирования, предварительно оценив полный аргумент, вместо того, чтобы вставлять $publish_dir переменная:

PS> $publishArg = '/p:WebProjectOutputDir=\"{0}\"' -f $publish_dir
PS> ./echoargs $publishArg
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects">
Другие вопросы по тегам