2008-08-18 11 views
13

¿Cómo convierto los parámetros de entrada de función al tipo correcto?¿Cómo hago un reemplazo de cadena en una función de PowerShell?

Quiero devolver una cadena que tiene eliminada 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 

Esta 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://", "") 

Respuesta

15

El concepto aquí es correcto.

El problema es con el nombre de la variable que ha elegido. $ input es una variable reservada utilizada por PowerShell para representar una matriz de entrada de canalización. Si cambias tu nombre de variable, no deberías tener ningún problema.

PowerShell tiene a replace operator, por lo que podría hacer que su función en

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

Esto funcionó para mí:

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

No use la variable $ input. Esta reservado. – luccio

15

obras respuesta de Steve. El problema con su intento de reproducir la secuencia de comandos de ESV es que está usando $input, que es una variable reservada (recopila automáticamente múltiples entradas canalizadas en una sola variable).

Sin embargo, debe utilizar .Replace() a menos que necesite las características adicionales de -replace (maneja expresiones regulares, etc.).

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

que funcione, pero también lo haría:

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

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

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

Espero que ayude. Por cierto, para demostrar la entrada de $:

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

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