Сведения о вопросе

PASHA

10:46, 24th August, 2020

Теги

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

Просмотров: 470   Ответов: 4

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

Я хочу вернуть строку, которая имеет часть 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://", "")



  Сведения об ответе

qwerty101

08:43, 4th August, 2020

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

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

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

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


  Сведения об ответе

DINO

21:06, 1st October, 2020

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


  Сведения об ответе

nYU

19:04, 3rd August, 2020

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


  Сведения об ответе

lesha

20:59, 6th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться