Powershell函数返回数组而不是字符串

时间:2018-11-07 07:36:11

标签: powershell

我正在导入一个csv,我想向其中添加一列(结果基于先前的列)

我的数据如下

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

我想添加一列称为“子网站”

所以我写了这个模块,但是问题是,实际的结束对象是数组而不是字符串

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 :(得分:2)

很好,您找到了答案。当您找到它时,我正在输入此信息。原因是因为-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