我正在导入一个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
2条答案
按热度按时间zvokhttg1#
很好,你找到了答案。我在你找到它的时候输入了这个。原因是因为
-match
返回了一个值,它被添加到管道中,这些都是从函数中“返回”的。例如,运行这一行,看看它是做什么的:
字符串
打印
True
。既然我把这个打出来了,这里有另一种方式来表达你的问题与修复...
型
ktca8awb2#
这是Powershell开发者做过的最愚蠢的事情之一。在c#中,语言并不试图覆盖程序员的愿望。这太荒谬了。
你可以把整个函数放在@()里面|像这样
字符串
一些阅读https://www.davemason.me/2021/11/29/powershell-functions-and-return-types
Function return value in PowerShell的