如何在PowerShell函数中进行字符串替换?
时间:2020-03-05 18:40:29 来源:igfitidea点击:
如何将函数输入参数转换为正确的类型?
我想返回一个字符串,其中删除了传递给它的部分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://", "")
解决方案
回答
function CleanUrl([string] $url) { return $url.Replace("http://", "") }
回答
这为我工作:
function CleanUrl($input) { return $input.Replace("http://", "") }
回答
这里的概念是正确的。
问题在于我们选择的变量名称。 $ input是PowerShell用来表示管道输入数组的保留变量。如果我们更改变量名,则应该没有任何问题。
PowerShell确实具有replace运算符,因此我们可以将其功能转换为
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