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

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

Я хочу вернуть строку, в которой удалена часть 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://", "")
18.08.2008 18:40:34
4 ОТВЕТА
РЕШЕНИЕ

Концепция здесь верна.

Проблема в названии переменной, которую вы выбрали. $ input - это зарезервированная переменная, используемая PowerShell для представления массива входных данных конвейера. Если вы измените имя переменной, у вас не должно возникнуть никаких проблем.

PowerShell имеет оператор замены , так что вы можете превратить свою функцию в

function CleanUrl($url)
{
    return $url -replace 'http://'
}
16
13.07.2015 13:17:04
function CleanUrl([string] $url)
{
    return $url.Replace("http://", "")
}
5
18.08.2008 19:00:27

Это сработало для меня:

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
-4
18.08.2008 19:08:40
Не используйте переменную $ input. Это зарезервировано.
luccio 15.12.2016 09:39:50

Ответ Стива работает. Проблема с вашей попыткой воспроизвести сценарий 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
16
16.09.2008 02:17:28