Powershell Get ChildItem 未列出路径

Powershell GetChildItem no path listed

我有一个 PowerShell 脚本可以扫描整个共享驱动器以创建记录保留清单。但是,当我 运行 代码时,我得到了几行有文件名但没有目录名的行。

起初我以为这些文件在我正在扫描的主根驱动器上,但实际上不是。为什么 PowerShell 会 return 文件名、文件大小和相关日期但没有目录名?

我试过根据文件名手动搜索,但找不到它们。

我正在使用变量将源和目标信息作为路径传递到脚本中,但这应该是有意义的。

$properties = @(
@{ Name = 'File Size (MB)'
    Expression = {[math]::Round(($_.Length / 1MB),2)}
}
'DirectoryName'
'Name'
'CreationTime'
'LastWriteTime'
@{ Name = 'Age'
    Expression = {[math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays /365,2)}
}
)
$target_files = Get-ChildItem $sourcepath* -recurse -include "*" | Select-Object $properties | 
Export-Csv $destinationpath${destinationfilename}.csv -NoTypeInformation

提前谢谢你, 女士

继续我的评论。

FileInfo 对象与 DirectoryInfo 对象具有不同的属性。对于您的问题,最值得注意的是 DirectoryName 属性,它存在于 FileInfo 但不存在于 DirectoryInfo 对象上。

例如,为 DirectoryInfo 对象返回这些属性:

PSPath            : Microsoft.PowerShell.Core\FileSystem::D:\Test
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::D:\
PSChildName       : Test
PSDrive           : D
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : Test
Target            : {}
LinkType          : 
Name              : Test
FullName          : D:\Test
Parent            : 
Exists            : True
Root              : D:\
Extension         : 
CreationTime      : 4-5-2020 15:33:48
CreationTimeUtc   : 4-5-2020 13:33:48
LastAccessTime    : 21-9-2021 15:59:43
LastAccessTimeUtc : 21-9-2021 13:59:43
LastWriteTime     : 19-9-2021 21:41:48
LastWriteTimeUtc  : 19-9-2021 19:41:48
Attributes        : Directory

这里是 FileInfo 对象的属性:

PSPath            : Microsoft.PowerShell.Core\FileSystem::D:\Test\Blah.txt
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::D:\Test
PSChildName       : Blah.txt
PSDrive           : D
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a----
VersionInfo       : File:             D:\Test\Blah.txt
                    InternalName:     
                    OriginalFilename: 
                    FileVersion:      
                    FileDescription:  
                    Product:          
                    ProductVersion:   
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:         
                    
BaseName          : Blah
Target            : {}
LinkType          : 
Name              : Blah.txt
Length            : 0
DirectoryName     : D:\Test
Directory         : D:\Test
IsReadOnly        : False
Exists            : True
FullName          : D:\Test\Blah.txt
Extension         : .txt
CreationTime      : 21-9-2021 16:04:49
CreationTimeUtc   : 21-9-2021 14:04:49
LastAccessTime    : 21-9-2021 16:04:49
LastAccessTimeUtc : 21-9-2021 14:04:49
LastWriteTime     : 21-9-2021 16:04:49
LastWriteTimeUtc  : 21-9-2021 14:04:49
Attributes        : Archive

您的代码的主要问题是您没有在 Get-ChildItem 上使用 -File 开关,因此,两个文件的 cmdlet returns 对象 个目录。

在您的 $properties 数组中,将 'DirectoryName' 替换为 'FullName',删除 $sourcepath* 中的星号并省略 -include "*" :

$properties = @{Name = 'File Size (MB)'; Expression = {[math]::Round(($_.Length / 1MB),2)}},
              'FullName','Name','CreationTime','LastWriteTime',
              @{Name = 'Age'; Expression = {[math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays / 365,2)}}

# use Join-Path to safely construct the path and filename for the output
$outputPath = Join-Path -Path $destinationpath -ChildPath ('{0}.csv' -f $destinationfilename)
Get-ChildItem $sourcepath -File -Recurse | Select-Object $properties | 
Export-Csv -Path $outputPath -NoTypeInformation