Pergunta

Como converto os parâmetros de entrada da função para o tipo correto?

Quero retornar uma string que tenha parte da URL passada removida.

Isso funciona, mas usa uma string codificada:

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

$SiteName = CleanUrl($HostHeader)
echo $SiteName

Isso falha:

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://", "")
Foi útil?

Solução

O conceito aqui está correto.

O problema está no nome da variável que você escolheu.$input é uma variável reservada usada pelo PowerShell para representar uma matriz de entrada de pipeline.Se você alterar o nome da variável, não deverá ter nenhum problema.

PowerShell tem um operador de substituição, para que você possa transformar sua função em

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

Outras dicas

A resposta de Steve funciona.O problema com sua tentativa de reproduzir o script do ESV é que você está usando $input, que é uma variável reservada (ela coleta automaticamente várias entradas canalizadas em uma única variável).

Você deve, no entanto, usar .Replace() a menos que precise dos recursos extras de -replace (ele lida com expressões regulares, etc.).

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

Isso funcionará, mas também funcionaria:

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

Além disso, ao invocar uma função do PowerShell, não use parênteses:

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

Espero que ajude.A propósito, para demonstrar $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://", "")
}

Isso funcionou para mim:

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top