15

sys ドライブで最新の MSDeploy 実行可能ファイルを検索するスクリプトがあります。以下を参照してください。

ただし、Compare-FileVersion次のエラーが原因で関数が呼び出されません。

Compare-FileVersions : Cannot process argument transformation on parameter 'file1'. Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.IO.FileInfo". At C:\DATA\Git\PowerShell\Test-Command.ps1:32 char:39
+         $winner = Compare-FileVersions($incumbent, $challenger);
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Compare-FileVersions], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Compare-FileVersions

スクリプトは次のとおりです。

function Find-Executable()
{
    # Find all MS Deploy executables and then make a table of path and version. Reverse sort and pick top one.

    pushd;

    # Workaround for bug in PS where ErrorAction spec'ed in the argument is ignored. http://stackoverflow.com/questions/17489372/ls-recurse-erroraction-silentlycontinue-doesnt-work

    # Bug is not fixed on build server with this code.

    $originalEAP = $ErrorActionPreference;
    $ErrorActionPreference = "SilentlyContinue";

    cd $env:SystemDrive;
    cd \;
    [System.IO.FileInfo[]]$allExecutables = ls -Include msdeploy.exe -Recurse -Force -ErrorAction SilentlyContinue;

    $ErrorActionPreference = $originalEAP;

    popd;

    if ($allExecutables.Count -lt 1)
    {
        throw $("No MS Deploy executables found in folders in " + $env:SystemDrive);
    }    

    [System.IO.FileInfo]$incumbent = $allExecutables[0];
    for($i = 0; $i -lt $allExecutables.Count; $i++)
    {        
        [System.IO.FileInfo]$challenger = $allExecutables[$i];
        $winner = Compare-FileVersions($incumbent, $challenger);
        $incumbent = $winner;
    }

    return $winner;
}

function Compare-FileVersions([System.IO.FileInfo]$file1, [System.IO.FileInfo]$file2)
{
    if ($file1.VersionInfo.FileMajorPart -gt $file2.VersionInfo.FileMajorPart)
    {
        return $file1;
    }
    elseif ($file2.VersionInfo.FileMajorPart -gt $file1.VersionInfo.FileMajorPart)
    {
        return $file2;
    }

    if ($file1.VersionInfo.FileMinorPart -gt $file2.VersionInfo.FileMinorPart)
    {
        return $file1;
    }
    elseif ($file2.VersionInfo.FileMinorPart -gt $file1.VersionInfo.FileMinorPart)
    {
        return $file2;
    }

    if ($file1.VersionInfo.FileBuildPart -gt $file2.VersionInfo.FileBuildPart)
    {
        return $file1;
    }
    elseif ($file2.VersionInfo.FileBuildPart -gt $file1.VersionInfo.FileBuildPart)
    {
        return $file2;
    }

    if ($file1.VersionInfo.FilePrivatePart -gt $file2.VersionInfo.FilePrivatePart)
    {
        return $file1;
    }
    elseif ($file2.VersionInfo.FilePrivatePart -gt $file1.VersionInfo.FilePrivatePart)
    {
        return $file2;
    }

    # They're both the same at this point.

    return $file1;
}

$version = Find-Executable;

echo $version;

しかし、これは、パラメーターとして渡される変数の型が実際に正しいという証拠です (明らかに、そうではありません。どういうわけか、そうでなければ私は SO に参加していないでしょう):

変数の型を示すスクリーンショット

それらは両方FileInfoであり、引数は両方ともそのタイプです。それで、私は何が欠けていますか?

4

1 に答える 1

37

このような引数を渡すと、このエラーが発生します

$winner = Compare-FileVersions($incumbent,$challenger)

この 2 つの変数をこのようにスペースで区切ってみてください。うまくいきます。

$winner = (Compare-FileVersions $incumbent $challenger)
于 2013-09-27T18:25:05.493 に答える