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

nxagd54h  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(200)

我正在导入一个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

zvokhttg

zvokhttg1#

很好,你找到了答案。我在你找到它的时候输入了这个。原因是因为-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

ktca8awb

ktca8awb2#

这是Powershell开发者做过的最愚蠢的事情之一。在c#中,语言并不试图覆盖程序员的愿望。这太荒谬了。
你可以把整个函数放在@()里面|像这样

function site {
    Param($s)
    {
    $s -match '(\d\d\d)'
    } | Out-Null;
    # custom object or string or whatever here
     return $Matches[0]
}

字符串
一些阅读https://www.davemason.me/2021/11/29/powershell-functions-and-return-types
Function return value in PowerShell

相关问题