powershell 使用Get-ChildItem检索文件夹、名称、全名

ax6ht2ek  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(213)

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

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 } }的完整文件路径时遇到了问题。
任何帮助都非常感谢。

kb5ga3dv

kb5ga3dv1#

当你想用PSPath来获取全名(完整的文件系统路径)时,你错误地引用了PSParentPath

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生成的输出对象([System.IO.DirectoryInfo]类型的示例)的标准属性,因此您可以简单地引用**FullName属性**:

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

注:'\\'将作为-split操作符的RHS,但如果你想跨平台友好,你可以使用[\\/]
注意:上面使用的基于hashtable的技术(@{ n = ...; e = ... },其中nName的缩写,eExpression的缩写)称为 * 计算属性 *,在概念about_Calculated_Properties帮助主题中进行了描述,适用于所有支持计算属性的小工具。

nzkunb0c

nzkunb0c2#

DirectoryInfo对象(Get-ChildItem的文件夹输出)具有带有文件夹名称和完整路径的属性NameFullName。它们还有一个属性Parent,它返回父文件夹的另一个DirectoryInfo对象。您可以将该信息添加为calculated property
因为你基本上想为列出的项添加祖父名称和路径,并且这些信息不会因为你不递归而改变,所以你可以确定它们一次,然后将它们作为静态信息添加:

$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

相关问题