Comment effectuer un remplacement de chaîne dans une fonction PowerShell ?
-
08-06-2019 - |
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://", "")
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://", "")
}