Powershell избавляется от новых строк в функции - PullRequest
3 голосов
/ 13 января 2012

Я пытаюсь запустить функцию, которая анализирует большую строку, содержащую новые строки, однако всякий раз, когда я передаю эту строку в функцию, она избавляется от новых строк и делает невозможным синтаксический анализ. Я что-то здесь не так делаю?

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

Если я наберу:

$s | Select-String -pattern "foo"

Я получаю правильный результат, но использую

parseString $s

возвращает всю строку без перевода строки. Есть предложения?

РЕДАКТИРОВАТЬ: Хм, после того, как немного возиться, я избавился от [строки], так что это

function parseString($s)

Кажется, это работает, но почему?

Ответы [ 2 ]

4 голосов
/ 13 января 2012

Что такое $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 голос
/ 13 января 2012

Удаление [string], вероятно, удаляет происходящий актерский состав.Таким способом вы можете привести типы объектов к другим типам.Например:

$thing = [int] 42
$thing.GetType().FullName

Выходные данные: System.Int32

$thing = [string] $thing
$thing.GetType().FullName

Выходные данные: System.String

Если ваш ввод является строковым массивом, [string] будет приведенэто в одну строку, например оператор -join.

Чтобы увидеть, что происходит, выведите $YourVariable.GetType().FullName перед вызовом функции и внутри функции (все еще используя [string]).

...