使用psake,exec和msbuild时如何正确转义目录?

时间:2011-10-13 18:52:51

标签: powershell msbuild escaping psake

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

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

路径已更改,但实际路径也包含间隔组件。双斜线是一种技巧,例如this answer

如果我直接运行,msbuild了解路径。但是,它需要像这样在psake中运行:

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 个答案:

答案 0 :(得分:2)

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

task build {
    $SolutionFile = "C:\TEMP\spaced path\ConsoleApplication1.sln"
    $OutputDir = "C:\\TEMP\\spaced path2\\"
    exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }
}

答案 1 :(得分:0)

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

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

答案 2 :(得分: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任务的所有参数,并检查它是否有效。

答案 3 :(得分: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 }

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

所以我现在暂时搁置这个问题,希望得到更好的答案。它应该清楚地显示变量。