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

我想返回一个字符串,其中传递的 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://", "")
有帮助吗?

解决方案

这里的概念是正确的。

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

PowerShell确实有 替换运算符, ,这样你就可以将你的函数变成

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

其他提示

史蒂夫的回答有效。您尝试重现 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
function CleanUrl([string] $url)
{
    return $url.Replace("http://", "")
}

这对我有用:

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top