【发布时间】:2015-12-02 02:45:24
【问题描述】:
我找到了一个不管路径大小都返回所有文件的 cmdlet。我想知道是否有一个等效的命令可以获取所有文件夹而不考虑路径大小?
Get-FolderItem 结合 robocopy 和 powershell 来返回所有文件,即使是路径大于 260 的文件。
有没有办法获取文件共享中的所有文件夹
【问题讨论】:
标签: powershell robocopy
我找到了一个不管路径大小都返回所有文件的 cmdlet。我想知道是否有一个等效的命令可以获取所有文件夹而不考虑路径大小?
Get-FolderItem 结合 robocopy 和 powershell 来返回所有文件,即使是路径大于 260 的文件。
有没有办法获取文件共享中的所有文件夹
【问题讨论】:
标签: powershell robocopy
Get-FolderItem 使用robocopy 开关/NDL 从日志输出中排除目录,用于获取文件信息。它还通过使用/S 开关来递归而不是/E 来避免空文件夹
只需将$params 变量从:
$params.AddRange(@("/L","/S","/NJH","/BYTES","/FP","/NC", "/NDL","/TS","/XJ","/R:0","/W:0"))
到
$params.AddRange(@("/L","/E","/NJH","/BYTES","/FP","/NC", "/NFL","/TS","/XJ","/R:0","/W:0"))
现在,Robocopy 将列出目录,而不是文件。由于目录的输出与文件略有不同,因此您还必须稍微更改解析逻辑。
改变
If ($_.Trim() -match "^(?<Size>\d+)\s(?<Date>\S+\s\S+)\s+(?<FullName>.*)") {
$object = New-Object PSObject -Property @{
ParentFolder = $matches.fullname -replace '(.*\\).*','$1'
FullName = $matches.FullName
Name = $matches.fullname -replace '.*\\(.*)','$1'
Length = [int64]$matches.Size
LastWriteTime = [datetime]$matches.Date
Extension = $matches.fullname -replace '.*\.(.*)','$1'
FullPathLength = [int] $matches.FullName.Length
}
$object.pstypenames.insert(0,'System.IO.RobocopyDirectoryInfo')
Write-Output $object
}
到
If ($_.Trim() -match "^(?<Children>\d+)\s+(?<FullName>.*)") {
$object = New-Object PSObject -Property @{
ParentFolder = $matches.fullname -replace '(.*\\).*','$1'
FullName = $matches.FullName
Name = $matches.fullname -replace '.*\\(.*)','$1'
}
$object.pstypenames.insert(0,'System.IO.RobocopyDirectoryInfo')
Write-Output $object
}
应该这样做
【讨论】: