Powershell摆脱了功能中的换行符

时间:2012-01-13 00:38:04

标签: function powershell newline

我正在尝试运行一个解析包含换行符的大字符串的函数,但每当我将此字符串传递给函数时,它就会删除新行并使其无法解析。我在这里做错了吗?

function parseString([string] $s)
{
  $result = $s | Select-String -pattern "foo"
  return $result
}

如果我输入:

$s | Select-String -pattern "foo"

我得到了正确的结果,但使用

parseString $s

返回没有换行符的整个字符串。有什么建议吗?

编辑:嗯,在弄乱了一点之后我摆脱了[字符串]所以它是

function parseString($s)

这似乎有效,但为什么呢?

2 个答案:

答案 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"),首先将字符串数组转换为字符串(通过简单地连接每个字符串),因此您将丢失换行符。如果您有$sGet-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]