使用 Get-ChildItem 命令获取文件夹、名称和完整路径

8

我目前正在使用这个脚本从给定的路径中获取名称、文件夹和文件夹名称:

   Get-ChildItem "C:\user\desktop"  | Select Name, `
  @{ n = 'Folder'; e = { Convert-Path $_.PSParentPath } }, `
  @{ n = 'Foldername'; e = { ($_.PSPath -split '[\\]')[-2] } } ,
  @{ n = 'Fullname'; e = { Convert-Path $_.PSParentPath } } |
    Export-Csv "C:\user\desktop\txt.txt" -Encoding Utf8 -NoTypeInformation

我遇到了麻烦,无法通过@{ n = 'Fullname'; e = { Convert-Path $_.PSParentPath } }获取完整的文件路径。

非常感谢您的帮助。


1
为什么要使用默认已有的属性表达式呢?Name 和 FullName 属性已经包含了这些信息。Get-Childitem | Select-Object Name, Fullname 就足够了。 - bluuf
使用 Get-Childitem | Select-Object Name, Fullname,@bluuf 可以得到想要的结果,但是父文件夹会单独成列。只有 Name 和 FullName 两列。 - Carlos
2个回答

8
你错误地引用了 PSParentPath,而实际上你需要使用 PSPath 来获取完整的名称(完整的文件系统路径):
Get-ChildItem "C:\user\desktop" | Select Name, `
  @{ n = 'Folder'; e = { Convert-Path $_.PSParentPath } }, `
  @{ n = 'Foldername'; e = { ($_.PSPath -split '[\\]')[-2] } } ,
  @{ n = 'Fullname'; e = { Convert-Path $_.PSPath } }  # NOT $_.PS*Parent*Path

然而,正如其他人指出的那样,完整路径是由Get-ChildItem产生的输出对象的标准属性,因此您可以简单地引用FullName属性:

Get-ChildItem "C:\user\desktop" | Select Name, `
  @{ n = 'Folder'; e = { Convert-Path $_.PSParentPath } }, `
  @{ n = 'Foldername'; e = { ($_.PSPath -split '[\\]')[-2] } } ,
  FullName

附言: '\\' 将作为 -split 运算符的 RHS, 但如果您希望跨平台友好,可以使用 [\\/]

注意: 上面使用的基于哈希表的技术 (@{ n = ...; e = ... }, 其中 nName 的缩写,eExpression 的缩写) 被称为计算属性, 在支持计算属性的所有 cmdlet 中都有相关概念 关于计算属性 帮助主题。


对于其他人,请注意在此处描述的@{ n = ... , e = { ... } }技术的使用。这里 - Nate Anderson
1
谢谢@TheRedPea,提供了一个好主意来链接解释。我已经更新了答案,并添加了官方帮助主题的链接,该主题现在描述了这种技术称为“计算属性”。您提供的文章很有帮助,但其中包含一些编辑评论,我认为有问题(“我个人不喜欢这样做会让命令变得很长,而且通常会促进一些我不想涉及的不良行为。”)。 - mklement0

6

DirectoryInfo对象(即文件夹的Get-ChildItem输出)具有NameFullName属性,用于表示文件夹的名称和完整路径。它们还具有一个Parent属性,返回父文件夹的另一个DirectoryInfo对象。您可以将该信息添加为计算属性

由于您基本上想要为列出的项目添加祖父级名称和路径,并且该信息不会更改,因为您不进行递归,因此可以确定它们一次并将其作为静态信息添加:

$dir = 'C:\some\folder'

$folder     = (Get-Item $dir).Parent
$folderName = $folder.Name
$folderPath = $folder.FullName

Get-ChildItem $dir |
    Select-Object Name, FullName,
        @{n='FolderName';e={$folderName}},
        @{n='Folder';e={$folderPath}} |
    Export-Csv 'C:\path\to\output.csv' -Encoding UTF8 -NoType

当我运行它时,只有名称和全名被填充。其余的输出为空白。 - Carlos
然后您的文件夹仅包含文件,而不是子文件夹。FileInfo对象具有不同的属性。 - Ansgar Wiechers
是的,该文件夹只包含文件。我想要的是我正在查找的目录上面的父文件夹的名称。 - Carlos
对于其他人,请注意在此处描述的@{ n = ... , e = { ... } }技术的使用。这里 - Nate Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接