在Select-Object中修改/转换数据

时间:2014-10-24 19:46:50

标签: powershell

说我有一个项目列表。我想导出到csv,但我想在做之前做一些计算/修改。

基本上,设置如下:

PS C:\Files> gci
Directory: C:\Files

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/23/2014   6:03 PM      11084 Blob.txt
-a---        10/13/2014   1:32 PM      31591 dates.txt
-a---         2/11/2014   1:46 PM      11990 out.txt

PS C:\Files> $data = gci

我可以轻松选择我想要放入CSV的项目。为简洁起见,省略了实际的Export-CSV部分

PS C:\Files> $data | Select-Object FullName,name

但我真正想做的是计算一些列,并包括CSV中的列。举个例子,假设我想计算'\'字符以了解文件夹深度。我想你可以告诉我在这里尝试的是什么,即使它错了。

PS C:\Files> $data | Select-Object FullName,name,FullName.Split('\').Count
Select-Object : A positional parameter cannot be found that accepts argument '1'.    

有没有办法让它发挥作用?

3 个答案:

答案 0 :(得分:11)

你需要的是calculated property(感谢Ansgar Wiechers纠正我的术语并提供链接)为你做这件事。您可以通过创建一种即兴散列表来在Select命令中完成此操作:

PS C:\Files> $data | Select-Object FullName,name,@{name='FolderDepth';expression= {$_.FullName.Split('\').Count}}

可以缩短为@{n='Name';e={scriptblock]} n代表名称,并且可以与l(标签的缩写)互换。 e是表达的缩写。

答案 1 :(得分:2)

是。您正在寻找的是使用calculated property的更复杂Select-Object声明。示例语法:

@{Label = "Calculation";Expression ={$_.FullName.Split('\').Count}}

然后将其插入到select语句中,通常包含其他变量。

$data | Select-Object FullName,name,@{Label = "TheCount";Expression ={$_.FullName.Split('\').Count}}

答案 2 :(得分:0)

我的提案(也比在select中更具可读性):

$data | % {Add-Member -name FolderDepth -Value $_.FullName.split("\").Count -MemberType NoteProperty -InputObject $_} | select FullName,Name,FolderDepth

这会向$ data添加一个属性,您可以在管道中使用$_.FolderDepth进一步使用该属性,就像任何其他属性一样。

这有什么不同之处在于如果你想在之后做一些事情,这个属性也将在管道之后可用