Как мне заменить строку в функции 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://", "")
Ответов (4)4
Концепция здесь правильная.
Проблема заключается в выбранном вами имени переменной. $ 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