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
我有一个 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