我试图格式化结果对象而不破坏它。但是我所有的努力和研究都使我失败。欢迎任何提示。
我的代码如下所示:
Set-Location 'C:\Temp'
$Files = Get-ChildItem -File | Select-Object FullName, Length
我得到的是:
FullName Length
-------- ------
C:\Temp\CleanupScript.txt 10600
C:\Temp\Columns.csv 4214
C:\Temp\Content.html 271034
C:\Temp\Content.txt 271034
C:\Temp\DirSizes.csv 78
我想要的是:
FullName Length
-------- ------
Temp\CleanupScript.txt 10600
Temp\Columns.csv 4214
Temp\Content.html 271034
Temp\Content.txt 271034
Temp\DirSizes.csv 78
当我尝试这个:
$Files = Get-ChildItem -File | Select-Object FullName, Length | % { $_.FullName.Remove(0, 3) }
我得到了正确的结果,但是丢失了“长度”列。
PS C:\Temp> $Files
Temp\CleanupScript.txt
Temp\Columns.csv
Temp\Content.html
Temp\Content.txt
Temp\DirSizes.csv
请帮忙。
非常感谢
帕特里克
最佳答案
最简单的方法是在Select
命令中构造所需的属性,例如:
$Files = Get-ChildItem -File | Select @{l='FullName';e={$_.FullName.Substring(3)}},Length
其格式是带有两个条目的哈希表。键是标签(或名称)和表达式。您可以将它们缩短为l(或n)和e。标签条目定义了您正在构造的属性的名称,表达式则定义了值。
如果要保留对象的所有原始方法和属性,则应向它们添加属性,而不要使用计算出的属性。您可以这样使用
Add-Member
来做到这一点:$Files = GCI -File | %{Add-Member -inputobject $_ -notepropertyname 'ShortPath' -notepropertyvalue $_.FullName.Substring(3) -PassThru}
然后,您可以按名称使用该属性(例如
$Files | FT ShortPath,Length -Auto
),同时仍然保留使用文件方法(例如Copy()
)和不使用该方法的能力。关于powershell - 在PowerShell中非破坏性地编辑对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48409104/