Pregunta

¿Cómo convierto los parámetros de entrada de la función al tipo correcto?

Quiero devolver una cadena a la que se le ha eliminado parte de la URL pasada.

Esto funciona, pero utiliza una cadena codificada:

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

$SiteName = CleanUrl($HostHeader)
echo $SiteName

Esto falla:

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

Solución

El concepto aquí es correcto.

El problema está en el nombre de la variable que has elegido.$input es una variable reservada utilizada por PowerShell para representar una matriz de entradas de canalización.Si cambia el nombre de su variable, no debería tener ningún problema.

PowerShell tiene un operador de reemplazo, para que puedas convertir tu función en

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

Otros consejos

La respuesta de Steve funciona.El problema con tu intento de reproducir el script de ESV es que estás usando $input, que es una variable reservada (recopila automáticamente múltiples entradas canalizadas en una sola variable).

Sin embargo, deberías usar .Replace() a menos que necesites las funciones adicionales de -replace (maneja expresiones regulares, etc.).

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

Eso funcionará, pero también lo haría:

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

Además, cuando invoque una función de PowerShell, no utilice paréntesis:

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

Espero que ayude.Por cierto, para demostrar $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://", "")
}

Esto funcionó para mí:

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top