说我有一个项目列表。我想导出到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'.
有没有办法让它发挥作用?
答案 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
进一步使用该属性,就像任何其他属性一样。
这有什么不同之处在于如果你想在之后做一些事情,这个属性也将在管道之后可用