4

気まぐれで、PowerShell を学習するために、MSBuild を使用してコード内の一連のソリューションをクリーンアップし、特定の引数セットでそれらをビルドするための非常に単純なスクリプトを作成することにしました。スクリプトは次のとおりです。

$sourceDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$cleanArgs = '/t:clean /verbosity:q /nologo /P:Configuration=Debug'
$buildArgs = '/verbosity:q /nologo /P:Platform="Any CPU";Configuration=Debug'
$solutions = @("asdf.sln","qwer.sln","zxcv.sln","yuio.sln","hjkl.sln","nm.sln")

function buildWithArgs([string[]]$solutionsToBuild = @(), [string]$args = 'default')
{
    Write-Host args: $args
    foreach($sln in $solutionsToBuild)
    {
        & $env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe "$sourceDir\$sln $args" | Out-Default
    }
}

buildWithArgs $solutions $buildArgs
buildWithArgs $solutions $cleanArgs

さて、私の問題は、関数「buildWithArgs」が $args パラメーターを尊重しないことです。これは、スクリプトを実行またはデバッグするときに、何を渡しても常に空です。しかし、$solutionsToBuild パラメーターは問題なく動作します。不適切な構文がありますか? $cleanArgs 文字列が何らかの形で不適切にフォーマットされていたり、エスケープされていなかったとしても、実行時に $args が常に空であるため、"asdf" のような単純な文字列で関数を機能させることさえできません。確かに小さなばかげたエラーであることにあなたが提供できる助けに感謝します!

4

2 に答える 2

3

1$argsつ目は、関数へのすべての引数を表す、PowerShell の特別な組み込みパラメーターです。これの副作用の 1 つは、ISE デバッガーでその値を確認できないことです。その名前を に変更してみてくださいMSBuildArgs

buildArgsおよびcleanArgsを配列として定義していることを確認してください。それらを 1 つの文字列として定義しています。@これを行うのは、(変数を参照するときの代わりに) PowerShell のスプラット演算子を使用できるようにするためです。この演算子$は、配列内の各引数をパラメーターとしてコマンドに送信します。

最後に、変数に格納されているパラメーターを引用符で囲む必要はありません。PowerShell は、すべての引用を行います。

これらの変更を行うと、次のようになります。

$sourceDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$cleanArgs = @('/t:clean','/verbosity:q','/nologo','/P:Configuration=Debug')
$buildArgs = @('/verbosity:q','/nologo','/P:Platform="Any CPU";Configuration=Debug')
$solutions = @("asdf.sln","qwer.sln","zxcv.sln","yuio.sln","hjkl.sln","nm.sln")

function buildWithArgs([string[]]$solutionsToBuild = @(), [string[]]$MSBuildArgs= 'default')
{
    Write-Host args: $args
    foreach($sln in $solutionsToBuild)
    {
        $msbuildPath = Join-Path $env:WINDIR Microsoft.NET\Framework64\v4.0.30319\msbuild.exe -Resolve
        & $msbuildPath (Join-Path $sourceDir $sln -Resolve) @MSBuildArgs | `
            Out-Default
    }
}

buildWithArgs $solutions $buildArgs
buildWithArgs $solutions $cleanArgs
于 2012-09-11T18:34:07.703 に答える
2

$argsPowerShell関数の特別な自動変数です。これには、関数の宣言されたパラメーターにバインドされていないパラメーターの配列が含まれています。明らかに不運/経験不足のために、宣言されたパラメーターの1つに同じ名前を付けることになり、問題が発生します。

パラメータの名前を別の名前に変更する場合、たとえば$BuildArgs、適切にバインドする必要があります。

ただし、現在のコードは、ソリューションパスと引数で構成される単一のパラメーターを使用してmsbuildを実行することに注意してください。複数の引数を指定してmsbuildを呼び出す構文ではありません。これにより問題が発生する場合は、別の質問を開くか、その特定の問題をオンラインで検索して、この質問が大きくなりすぎないようにすることをお勧めします。

于 2012-09-11T18:25:21.897 に答える