ParameterArgumentTransformationError
J'ai un script, voir ci-dessous, que les recherches les plus récentes MSDeploy exécutable sur le sys lecteur.
Cependant, mon Compare-FileVersion
fonction n'est pas appelée en raison de l'erreur suivante:
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
Voici le 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;
Mais voici la preuve que les types des variables passées en paramètres sont en effet correcte, (bien qu'ils ne sont pas, en quelque sorte, sinon je ne serais pas ici):
Ils sont à la fois FileInfo
, les arguments sont à la fois de ce type. Donc ce qui me manque?
OriginalL'auteur Luke Puplett | 2013-09-27
Vous devez vous connecter pour publier un commentaire.
Vous obtiendrez cette erreur si vous passez des arguments comme ça
essayer de séparer ces deux variables avec un espace comme ceci et cela fonctionnera.
C'était la première chose que j'ai rencontré lorsque j'ai écrit mon premier PS de la fonction.
Si vous utilisez Set-StrictMode -v 2, PowerShell affiche un message d'erreur lorsque vous utilisez des parenthèses pour passer plusieurs arguments pour les aider à attraper exactement ce problème.
OriginalL'auteur Mitul