2008-08-18 26 views
13

Wie konvertiere ich Funktions-Eingabeparameter in den richtigen Typ?Wie erstelle ich eine String-Ersetzung in einer PowerShell-Funktion?

Ich möchte eine Zeichenfolge zurückgeben, die einen Teil der übergebenen URL entfernt hat.

Dies funktioniert, aber es verwendet eine hartcodierte Zeichenfolge:

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

$SiteName = CleanUrl($HostHeader) 
echo $SiteName 

Dies schlägt fehl:

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://", "") 

Antwort

15

Das Konzept hier ist richtig.

Das Problem ist mit dem Variablennamen, den Sie gewählt haben. $ input ist eine reservierte Variable, die von PowerShell verwendet wird, um ein Array von Pipeline-Eingaben darzustellen. Wenn Sie Ihren Variablennamen ändern, sollten Sie kein Problem haben.

Powershell hat a replace operator, so könnten Sie Ihre Funktion in

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

Das ist für mich gearbeitet:

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

Verwenden Sie nicht $ Input-Variable. Es ist reserviert. – luccio

15

Steves Antwort Werke machen. Das Problem mit dem Versuch, das ESV-Skript zu reproduzieren, besteht darin, dass Sie $input verwenden. Dies ist eine reservierte Variable (sie sammelt automatisch mehrere Pipe-Eingaben in eine einzelne Variable).

Sie sollten jedoch .Replace() verwenden, es sei denn, Sie benötigen die zusätzlichen Funktionen von -replace (behandelt reguläre Ausdrücke usw.).

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

Das wird funktionieren, aber so würde:

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

Auch, wenn Sie eine Powershell-Funktion aufrufen, keine Klammern verwenden:

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

Hoffnung, das hilft. By the way, zu demonstrieren $ input:

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

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