如何在PowerShell函数中进行字符串替换?

18

如何将函数输入参数转换为正确的类型?

我想返回一个字符串,其中删除了传入的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://", "")
4个回答

19

史蒂夫的答案可行。你尝试复制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

希望这有所帮助。顺便提一下,为了展示$input:

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

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

16

这里的概念是正确的。

问题在于您选择的变量名 $input 是 PowerShell 用来表示管道输入数组的保留变量。如果您更改变量名,就不应该有任何问题。

PowerShell 确实具有替换运算符,因此您可以将函数修改为:

function CleanUrl($url)
{
    return $url -replace 'http://'
}

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

-4
这对我有用:

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

3
请勿使用$input变量,该变量已被预留。 - luccio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接