Powershell 在“选择对象”中修改/变换数据
假设我有一张物品清单。我想导出到csv,但我想在导出之前进行一些计算/修改 基本上,设置如下所示: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---
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