Как мне выполнить замену строки в функции PowerShell?

StackOverflow https://stackoverflow.com/questions/15062

Вопрос

Как мне преобразовать входные параметры функции в нужный тип?

Я хочу вернуть строку, в которой удалена часть переданного в нее 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