Функция Powershell, возвращающая массив вместо строки - PullRequest
0 голосов
/ 07 ноября 2018

Я импортирую CSV, и я хотел бы добавить столбец к нему (с результатом на основе предыдущих столбцов)

мои данные выглядят так

host address,host prefix,site
10.1.1.0,24,400-01

Я хотел бы добавить столбец под названием "sub site"

поэтому я написал этот модуль, но проблема в том, что фактическим конечным объектом является массив вместо строки

function site {
    Param($s)
    $s -match '(\d\d\d)'
     return $Matches[0]
}

$csv = import-csv $file | select-object *,@{Name='Sub Site';expression= {site $_.site}}

если я запускаю команду

PS C:\>$csv[0]

Host Address :10.1.1.0
host prefix  :24
site         :400-01
sub site     : {True,400}

когда это должно выглядеть

PS C:\>$csv[0]

Host Address :10.1.1.0
host prefix  :24
site         :400-01
sub site     : 400

РЕДАКТИРОВАТЬ: Я нашел решение, но теперь вопрос почему.

Если я изменю свою функцию на $s -match "\d\d\d" |out-null, я получу ожидаемое 400

1 Ответ

0 голосов
/ 07 ноября 2018

Хорошо, что вы нашли ответ. Я печатал это так, как ты нашел. Причина в том, что -match возвращает значение, и оно добавляется в конвейер, который все "возвращается" из функции.

Например, запустите эту строку и посмотрите, что делает:

"Hello" -match 'h'

Он печатает True.

Так как я набрал это, вот еще один способ сформулировать ваш вопрос с исправлением ...

function site {
    Param($s)
    $null = $s -match '(\d\d\d)'
    $ret =  $Matches[0]

    return $ret
}

$csv = @"
host address,host prefix,site
10.1.1.1,24,400-01
10.1.1.2,24,500-02
10.1.1.3,24,600-03
"@

$data = $csv | ConvertFrom-Csv

'1 =============='
$data | ft -AutoSize

$data2 = $data | select-object *,@{Name='Sub Site';expression= {site $_.site}}

'2 =============='
$data2 | ft -AutoSize
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...