2008-08-18 47 views
13

如何將函數輸入參數轉換爲正確的類型?如何在PowerShell函數中進行字符串替換?

我想返回一個字符串,其中有部分傳入的URL已被刪除。

這工作,但它採用的是硬編碼字符串:

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

$SiteName = CleanUrl($HostHeader) 
echo $SiteName 

這種失敗:

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

回答

15

這裏的概念是正確的。

問題出在你選擇的變量名上。 $ input是PowerShell用來表示流水線輸入數組的一個保留變量。如果您更改變量名稱,則不會有任何問題。

PowerShell中確實有a replace operator,所以你可以讓你的功能分爲

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

這爲我工作:

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

不要使用$輸入變量。它是保留的。 – luccio 2016-12-15 09:39:50

15

史蒂夫的答案作品。您嘗試重現ESV腳本的問題在於您使用的是$input,它是一個保留變量(它會自動將多個管道輸入收集到一個變量中)。

但是,您應該使用.Replace(),除非您需要-replace的額外功能(它處理正則表達式等)。

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

,將工作,但這樣會:

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

此外,當你調用一個PowerShell的函數,不要使用括號:

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

希望有所幫助。順便說一下,爲了演示$輸入:

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

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