Powershell 在“选择对象”中修改/变换数据

Powershell 在“选择对象”中修改/变换数据,powershell,Powershell,假设我有一张物品清单。我想导出到csv,但我想在导出之前进行一些计算/修改 基本上,设置如下所示: PS C:\Files> gci Directory: C:\Files Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 10/23/2014 6:03 PM 11084 Blob.txt -a---

假设我有一张物品清单。我想导出到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的项目。为简洁起见,省略了实际的导出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'.    

有没有办法让它工作起来?

是的。您要查找的是更复杂的
Select Object
语句。示例语法:

@{Label=“Calculation”;表达式={$\.FullName.Split('\').Count}

然后将其插入select语句,通常与其他变量一起插入

$data | Select-Object FullName,name,@{Label = "TheCount";Expression ={$_.FullName.Split('\').Count}}
您需要的是一个(感谢Ansgar Wiechers更正我的术语并提供链接)来为您做到这一点。通过创建一种即兴哈希表,您可以在Select命令中实现这一点,如下所示:

PS C:\Files> $data | Select-Object FullName,name,@{name='FolderDepth';expression= {$_.FullName.Split('\').Count}}
可以缩短为
@{n='Name';e={scriptblock}
,其中
n
代表名称,可以与
l
(标签的缩写)互换
e
是expression的缩写。

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

这将向$data添加一个属性,与任何其他属性一样,您可以在管道中进一步使用
$\FolderDepth


不同之处在于,如果您想在调用它们之后对管道执行操作,则此属性在管道之后也可用。注意,您需要将
-Passthru
参数添加到
添加成员
,否则它不会将对象沿管道传递到
选择
cmdlet。
$data | % {Add-Member -name FolderDepth -Value $_.FullName.split("\").Count -MemberType NoteProperty -InputObject $_} | select FullName,Name,FolderDepth