2013-09-27 3 views
9

मेरे पास एक स्क्रिप्ट है, नीचे देखें, जो सिस ड्राइव पर निष्पादन योग्य हालिया एमएसडीईपी की खोज करता है।पैरामीटर एर्ग्यूमेंट ट्रान्सफॉर्मररर

लेकिन, मेरा 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 पर नहीं होगा):

Screenshot showing variable types

वे FileInfo दोनों हैं, तर्क दोनों ही प्रकार हैं। तो मुझे क्या याद आ रही है?

उत्तर

17

अगर आप इस तरह की एक जगह के साथ इन दो चर अलग करने के लिए इस

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

कोशिश की तरह तर्क पारित यह त्रुटि प्राप्त हो जाएगा और यह काम करेंगे।

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

लॉर्डी! काश मैं कह सकता हूं कि मैंने पहली बार ऐसा किया है लेकिन पिछले 10 वर्षों में सी # में बिताया है, मैं अपनी 'मूल जीभ' में बहुत आसानी से फिसल गया हूं। –

+2

यह पहली बात थी जब मैंने अपना पहला पीएस फ़ंक्शन लिखा था। – Mitul

+1

यदि आप Set-StrictMode -v 2 का उपयोग करते हैं, तो PowerShell एक त्रुटि की रिपोर्ट करेगा जब आप इस समस्या को ठीक करने में सहायता के लिए कई तर्क पारित करने के लिए अभिभावकों का उपयोग करते हैं। –