¿Cómo hago un reemplazo de cadena en una función de PowerShell?
-
08-06-2019 - |
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://", "")
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://", "")
}