2008-08-18 13 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

15

スティーブの答えは作品の中に、あなたの関数を作ることができます。 ESVのスクリプトを再現しようとすると、$inputが使用されています。これは予約変数です(複数のパイプ入力を1つの変数に自動的に収集します)。

ただし、-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 
関連する問題