2008-08-18 42 views
13

Comment convertir les paramètres d'entrée de fonction au bon type?Comment remplacer une chaîne dans une fonction PowerShell?

Je souhaite renvoyer une chaîne dont 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://", "") 

Répondre

15

Le concept est correct.

Le problème provient 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ée de pipeline. Si vous changez le nom de votre variable, vous ne devriez avoir aucun problème.

PowerShell ne a replace operator, vous pouvez donc faire votre fonction dans

function CleanUrl($url) 
{ 
    return $url -replace 'http://' 
} 
5
function CleanUrl([string] $url) 
{ 
    return $url.Replace("http://", "") 
} 
-4

Cela a fonctionné pour moi:

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

N'utilisez pas la variable d'entrée $. C'est réservé. – luccio

15

œuvres de réponse de Steve. Le problème avec votre tentative de reproduire le script ESV est que vous utilisez $input, qui est une variable réservée (elle recueille automatiquement plusieurs entrées canalisées dans une seule variable).

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

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

qui fonctionnera, mais il en serait:

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

Aussi, lorsque vous invoquez une fonction PowerShell, ne pas utiliser les parenthèses:

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

espoir qui aide. Soit dit en passant, pour démontrer l'entrée $:

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

# Notice these are arrays ... 
$HostHeaders = @("http://google.com","http://stackoverflow.com") 
$SiteNames = $HostHeader | CleanUrls 
Write-Output $SiteNames