2013-09-27 3 views
9

Ho uno script, vedere sotto, che cerca l'eseguibile MSDeploy più recente sull'unità sys.ParameterArgumentTransformationError

Tuttavia, la mia funzione Compare-FileVersion non è chiamato a causa del seguente errore:

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 

Ecco lo script:

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; 

Ma qui è la prova che i tipi delle variabili vengono passati come parametri sono davvero corretto (chiaramente non lo sono, in qualche modo, altrimenti non sarei qui su SO):

Screenshot showing variable types

Sono entrambi FileInfo, gli argomenti sono entrambi di quel tipo. Quindi cosa mi sto perdendo?

risposta

17

Otterrete questo errore se si passa argomenti come questo

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

cercare di separare questi due variabili con uno spazio come questo e funzionerà.

$winner = (Compare-FileVersions $incumbent $challenger) 
+2

Lordy! Vorrei poter dire che è la prima volta che lo faccio, ma dopo aver trascorso gli ultimi 10 anni in C#, scivolo nella mia "lingua nativa" fin troppo facilmente. –

+2

Questa è stata la prima cosa che ho incontrato quando ho scritto la mia prima funzione PS. – Mitul

+1

Se si utilizza Set-StrictMode -v 2, PowerShell segnala un errore quando si utilizzano i paren per passare più argomenti per aiutare a cogliere esattamente questo problema. –