2

PowerShell で次のコマンドを実行できます。

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

パスは変更されていますが、実際のパスには間隔のあるコンポーネントも含まれています。ダブルスラッシュは、たとえばこの回答のトリックです。

それを直接実行すると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: 指定できるプロジェクトは 1 つだけです。」

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

私もこれに苦労してきましたが、最終的に思いついた答えは、パスだけでなく、スイッチ全体を引用することです。

したがって、たとえば:

$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 に答える
0

私は以下でこれを試しましたが、うまくいきました。私が追加した唯一のものは、msbuildコマンドの後に二重引用符( ")です。これは私が試したことです:

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

Task Default -depends Build


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

ご覧のとおり、ビルド ディレクトリにはスペースが含まれています ('つぶやきシャープ')。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

OutDir を引用符で囲みたいのですが、一重引用符を入れると、引数に他の引用符が含まれているためにコマンド シェル パーサーが混乱するため、それらの引用符を二重引用符で囲んでエスケープする必要があります。

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