Question

Comment convertir les paramètres d’entrée de fonction au bon type ?

Je souhaite renvoyer une chaîne dans laquelle une partie de l'URL transmise a été supprimée.

Cela fonctionne, mais il utilise une chaîne codée en dur :

function CleanUrl($input)
{
    $x = "http://google.com".Replace("http://", "")
    return $x
}

$SiteName = CleanUrl($HostHeader)
echo $SiteName

Cela échoue :

function CleanUrl($input)
{
    $x = $input.Replace("http://", "")
    return $x
}

Method invocation failed because [System.Array+SZArrayEnumerator] doesn't contain a method named 'Replace'.
At M:\PowerShell\test.ps1:13 char:21
+     $x = $input.Replace( <<<< "http://", "")
Était-ce utile?

La solution

Le concept ici est correct.

Le problème vient du nom de variable que vous avez choisi.$input est une variable réservée utilisée par PowerShell pour représenter un tableau d'entrées de pipeline.Si vous changez le nom de votre variable, vous ne devriez avoir aucun problème.

PowerShell a un opérateur de remplacement, afin que vous puissiez transformer votre fonction en

function CleanUrl($url)
{
    return $url -replace 'http://'
}

Autres conseils

La réponse de Steve fonctionne.Le problème avec votre tentative de reproduction du script ESV est que vous utilisez $input, qui est une variable réservée (elle collecte automatiquement plusieurs entrées redirigées dans une seule variable).

Vous devez cependant utiliser .Replace() sauf si vous avez besoin de la ou des fonctionnalités supplémentaires de -replace (il gère les expressions régulières, etc.).

function CleanUrl([string]$url)
{
    $url.Replace("http://","")
}

Cela fonctionnera, mais aussi :

function CleanUrl([string]$url)
{
    $url -replace "http://",""
}

De plus, lorsque vous appelez une fonction PowerShell, n'utilisez pas de parenthèses :

$HostHeader = "http://google.com"
$SiteName = CleanUrl $HostHeader
Write-Host $SiteName

J'espère que cela pourra aider.Au fait, pour démontrer $input :

function CleanUrls
{
    $input -replace "http://",""
}

# Notice these are arrays ...
$HostHeaders = @("http://google.com","http://stackoverflow.com")
$SiteNames = $HostHeader | CleanUrls
Write-Output $SiteNames
function CleanUrl([string] $url)
{
    return $url.Replace("http://", "")
}

Cela a fonctionné pour moi :

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top