powershell:查找路径最长的子目录

powershell:查找路径最长的子目录,powershell,filesystems,Powershell,Filesystems,我想在给定目录的子目录中查找最长路径,因为我遇到了以下错误: 指定的路径、文件名或两者都太长。 完全限定文件名必须少于260个字符, 并且目录名必须少于248个字符。 这就是我尝试过的: $dir = "\\share\server\toto" Get-ChildItem -Path $dir -Recurse -Directory | Select-Object Name,FullName, @{Name='FileCount';Expression = {(Get-ChildItem

我想在给定目录的子目录中查找最长路径,因为我遇到了以下错误:

指定的路径、文件名或两者都太长。
完全限定文件名必须少于260个字符,
并且目录名必须少于248个字符。
这就是我尝试过的:

$dir = "\\share\server\toto" 
Get-ChildItem -Path $dir -Recurse -Directory | 
Select-Object Name,FullName,
@{Name='FileCount';Expression = {(Get-ChildItem -Path $_.FullName -File -Recurse| Measure-Object).Count}} `
| Format-List *
但这给了我所有的目录


相反,我想查找路径最长的前5个目录。

这将返回路径最长的5个目录:

Get-ChildItem -Path $dir -Recurse -Directory | % { $_.FullName } | Sort-Object { $_.Length } -Descending | Select -first 5

错误消息表明系统上未启用长路径支持[1]-在Windows 10上,您现在可以在系统范围内为基于.NET Framework v4.6.2+的应用程序启用它-请参阅

禁用长路径支持后,
Get-ChildItem
(和
Get-Item
)将无法在Windows PowerShell中找到文件名过长的文件和目录。

相比之下,PowerShell[Core]v6+在默认情况下启用了长路径支持,不需要额外的工作——也就是说,您的问题甚至不会出现在那里

在Windows PowerShell中,要查找禁用长路径支持的太长路径,您必须将长路径选择加入前缀添加到完整、文字化、规范化的目标路径之前:

  • 对于本地路径,该前缀是
    \\?\
    ;e、 例如,
    '\\?\C:\temp'

  • 对于UNC路径,前缀为
    \?\UNC\
    ,并从UNC路径中删除第一个
    \
    ;e、 g,
    “\\?\UNC\share\server\toto”

以下命令将查找所有过长的子目录路径(无论有多少路径),并按路径长度降序排序:

# $dir = ...  # set the target dir.

# Construct the long-path-opt-in form of the path (covers both local and UNC paths).
$dirLongPaths = ('\\?\' + (Convert-Path $dir)) -replace '^(\\\\[?]\\)\\\\', '$1UNC\'

Get-ChildItem -LiteralPath $dirLongPaths -Recurse -Directory | 
  Where-Object { $_.FullName.Length -ge 248 } |
    Sort-Object -Descending -Property { $_.FullName.Length } | 
      Select-Object -Property Name, FullName, @{
        Name='FileCount';
        Expression = {(Get-ChildItem -LiteralPath $_.FullName -File -Recurse).Count}
      } | Format-List
注意,我简化了
表达式
脚本块,只需直接访问
Get ChildItem
调用的结果上的
Count

请注意
排序对象
调用,该调用按计算属性
{$\uu0.FullName.Length}
按降序(
.FullName
)排序,即按每个输入目录信息对象的完整路径的长度(
.FullName

还请注意,
\\?\
前缀也不会应用于嵌套的
Get ChildItem
调用,因为第一个调用输出的目录信息对象的
.FullName
属性已经包含前缀



[1] 历史上,文件系统路径仅限于
259
char。总体和至
247
chars。对于文件路径的目录部分。默认情况下,这些限制仍然是为了向后兼容而强制执行的,即使底层API不再受这些限制的约束。系统/应用程序可以通过选择加入机制来消除这些限制。

这是可行的,但请注意,您正在排序和输出路径字符串,而不是问题中的目录信息对象。要获得后者,请使用
get ChildItem-Path$dir-Recurse-Directory | Sort Object{$\ FullName.Length}-Descending | Select-first 5
,但请注意,在Windows PowerShell中,如问题中的错误消息所示,Windows 10中未启用长路径支持,如果最长路径的实际长度超过了259/247个字符的传统限制,那么这并不能解决问题。对于文件/dirs.,因为
Get ChildItem
将只找到带有“\\?\”前缀的文件。@lockceee:您的PowerShell版本是什么,网络共享所在的服务器运行的Windows版本是什么(我想服务器必须运行Windows)?运行我的代码后,
$dirLongPaths
包含什么?您是否仅使用
get ChildItem$dir
获得输出?共享服务器连接在Y:,我替换了我的变量dir,$dir=“Y:\”我得到了与上述相同的错误您的意思是根本没有输出?
Get ChildItem-LiteralPath$dirLongPaths
是否生成输出?我尝试以下代码:$dir=“\\share\\server$”$dirLongPaths=(“\\?\”+(转换路径$dir))-replace“^(\\\[?]”\)\\\\”,“$1UNC\”Get ChildItem-LiteralPath$dirLongPaths,我得到一个错误:Get ChildItem:Path中的非法字符。在第3行char:1+Get ChildItem-LiteralPath$dirlongpaths您的
$dir
值有太多
\
字符。它应该是:
$dir='\\share\server$'
,但这并不能解释问题。将
$dirLongPaths
变量传递给
Get ChildItem
时,该变量的实际逐字内容是什么?