我正在尝试运行一个解析包含换行符的大字符串的函数,但每当我将此字符串传递给函数时,它就会删除新行并使其无法解析。我在这里做错了吗?
function parseString([string] $s)
{
$result = $s | Select-String -pattern "foo"
return $result
}
如果我输入:
$s | Select-String -pattern "foo"
我得到了正确的结果,但使用
parseString $s
返回没有换行符的整个字符串。有什么建议吗?
编辑:嗯,在弄乱了一点之后我摆脱了[字符串]所以它是function parseString($s)
这似乎有效,但为什么呢?
答案 0 :(得分:4)
什么是$s
?如果它是一个字符串数组,那么因为你说parseString
接受一个字符串,所以字符串数组被转换成一个字符串。另一方面,如果$s
是一个字符串,它将起作用(如下所示):
function parseString([string] $s)
{
$result = $s | Select-String -pattern "foo"
return $result
}
$s =@'
first line
second line with foo
third line
'@
parseString $s
但是如果$s=@("first line","secondline with foo","third line")
,首先将字符串数组转换为字符串(通过简单地连接每个字符串),因此您将丢失换行符。如果您有$s
,Get-Content
等,情况属实。
请注意,大多数情况下,您不需要在Powershell中指定类型。在分配变量或函数参数时是它。
PS:
如果你做了
$ofs = "`n"
parseString $s
您将使用[string]
获得预期结果。
答案 1 :(得分:1)
删除[string]
可能正在删除正在发生的演员表。您可以通过这种方式将对象类型转换为其他类型。例如:
$thing = [int] 42
$thing.GetType().FullName
输出:System.Int32
$thing = [string] $thing
$thing.GetType().FullName
输出:System.String
如果您的输入是字符串数组,[string]
会将其转换为单个字符串,例如-join
运算符。
要查看正在讨价还价的内容,请在调用函数之前和函数内部(仍然使用$YourVariable.GetType().FullName
)打印[string]
。