2

我可以在 PowerShell 中执行以下命令:

msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\"

路径已更改,但真实路径也包含间隔组件。双斜线是来自例如this answer的一个技巧。

如果我直接运行它,就可以msbuild理解路径。但是,它需要像这样运行:

exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }

如果路径没有空格,那可以工作,但我想调整它以使用空格(对于 sln 路径和 OutDir)。我试过了,但我无法弄清楚逃脱。

编辑:

为了澄清,如果我在 psake 中对完整路径进行硬编码,它也可以工作:

exec { msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\" }

但是,它需要使用 OutputDir 变量(不是双斜杠转义的)。因此,我为此添加了一个临时变量,然后尝试构造命令行。:

$double_slashed_dir = $OutputDir.Replace('\', '\\');
write $double_slashed_dir;
exec { msbuild $SolutionFile /p:MvcBuildViews=False "/p:OutDir=`"$double_slashed_dir`"" }

这不起作用(我尝试了几种变体)。有了上面我得到“MSB1008:只能指定一个项目”。

4

5 回答 5

2

这种变化对我有用(双斜杠和斜杠$OutputDir似乎很重要):

task build {
    $SolutionFile = "C:\TEMP\spaced path\ConsoleApplication1.sln"
    $OutputDir = "C:\\TEMP\\spaced path2\\"
    exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }
}
于 2011-10-17T07:11:32.960 回答
0

您想在 OutDir 周围加上引号,但由于参数中的其他引号,加上单引号会混淆命令 shell 解析器,因此您需要通过双引号来转义这些引号:

exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=`"`"$OutputDir`"`"" }
于 2011-10-13T20:41:37.370 回答
0

我用以下方法尝试了这个,它奏效了。我唯一添加的是 msbuild 命令后的双引号(“)。这是我尝试过的:

properties{
    $build_Dir="F:\projects\tweet sharp\src";
}

Task Default -depends Build


Task Build {
        Exec { msbuild "$build_Dir\TweetSharp.sln" }
}

如您所见,构建目录包含一个空格('tweet sharp')。只需尝试将 msbuild 任务的所有参数括在双引号中并检查它是否有效。

于 2011-10-16T14:48:29.177 回答
0

我得到了它的工作Invoke-Expression

$double_slashed_dir = $OutputDir.Replace('\', '\\');
$msbuild_command = 'msbuild "' + $SolutionFile + '" /p:MvcBuildViews=False /p:OutDir="' + $double_slashed_dir + '"';
exec { Invoke-Expression $msbuild_command }

我认为这有点骇人听闻。它需要字符串连接,据我所知,Invoke-Expression基本上是 eval (尽管它应该是安全的,因为这里没有涉及用户输入)。

所以我暂时把这个问题留着,希望有更好的答案。它应该清楚地显示变量。

于 2011-10-17T02:28:42.477 回答
0

我也一直在为此苦苦挣扎,我最终得出的答案是:引用整个开关,而不仅仅是路径。

因此,例如:

$buildBranch = "a path/with multiple/spaces in/"

# Use an array of arguments for common build settings, note: no trailing slash after Apps
$buildSettings = (
    ('"/Property:SolutionDir=' + $buildBranch + '\My Apps"'),
    '/t:Build', 
    '/p:PlatformTarget=x86', 
    '/p:Configuration=Release')

# Combine the common build settings with the specific project
$arg = $buildSettings + @('"' + $buildBranch + '\My Apps\MyProjectPath\MyProject.vcxproj"')

exec {
    &$msbuild $arg
}

这与我所有其他尝试的主要区别在于 /Property 开关的引用。

我最初是这样做的:

'/Property:SolutionDir="' + $buildBranch + '\My Apps"'

请注意,我想传递给 msbuild 的双引号出现在开关名称之后和值之前。

MsBuild 会看到:

/Property:SolutionDir="some path\with spaces\My Apps"

这没有用。

我将其更改为:

'"/Property:SolutionDir=' + $buildBranch + '\My Apps"'

MsBuild 会看到:

"/Property:SolutionDir=some path\with spaces\My Apps"

这确实奏效了!

于 2012-01-26T10:58:19.423 回答