【问题标题】:How do I find files with a path length greater than 260 characters in Windows?如何在 Windows 中查找路径长度大于 260 个字符的文件?
【发布时间】:2012-09-23 17:13:49
【问题描述】:

我在 XP windows 脚本中使用 xcopy 以递归方式复制目录。我不断收到“内存不足”错误,我理解这是因为我尝试复制的文件路径太长。我可以轻松减少路径长度,但不幸的是我无法确定哪些文件违反了路径长度限制。复制的文件被打印到标准输出(我将其重定向到日志文件),但错误消息被打印到终端,所以我什至无法大致确定错误是针对哪个目录给出的.

【问题讨论】:

标签: windows windows-xp xcopy max-path


【解决方案1】:

执行dir /s /b > out.txt,然后在位置 260 处添加指南

在powershell中cmd /c dir /s /b |? {$_.length -gt 260}

【讨论】:

  • dir /s /b > out.txt 完美地完成了这项工作。谢谢。 “'Get-ChildItem' 未被识别为内部或外部命令、可运行程序或批处理文件。”我想我没有 powershell。
  • @WestHamster,您必须在 PowerShell 控制台中运行该命令。
  • 它会引发如下错误:Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. 随之而来的是,只打印了一个缩短的路径。例如:D:\Dropbox\ProY...sh._setbinddata。这些正是我想要找到的路径,但我看不到整个路径!有什么办法吗?
  • 我是唯一一个不能让它工作的人吗?使用 Win7 64 位家庭高级版,Powershell 2.0 - 当我创建一个具有长名称(240 个字符)的测试文件,然后将其所在的目录重命名为也具有长名称时,Get-ChildItems -r * 停止查看该文件.. . 只有dir /s /b 适合我。
  • 查看我的答案,了解在 powershell 中实现此目的的方法,允许您找到有问题的文件名(超过 260 个字符的文件名)或忽略它们。
【解决方案2】:

你可以重定向标准错误。

更多解释here,但有如下命令:

MyCommand >log.txt 2>errors.txt

应该抓取您正在寻找的数据。

另外,作为一个技巧,如果路径以 \\?\ (msdn) 为前缀,Windows 会绕过该限制

如果您有一个以长路径开头的根目录或目的地,那么另一个技巧也许SUBST 会有所帮助:

SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D

【讨论】:

  • 重定向标准输出和错误应该给我一个足够好的指示大文件在哪里谢谢。命令 > 文件 2>&1
  • 这会起作用,但是我的命令应该将错误分离到一个单独的文件中
  • \\?\ 看起来也不错。我无法让以下工作: xcopy /s \\?\Q:\nuthatch \\?\Q:\finch
  • hmm... 似乎\\?\ 不适用于命令行。使用SUBST 添加了另一个想法
  • 不幸的是 subst 不会太有用,因为命令的类型是:xcopy /sq:\nuthatch q:\finch
    并且长路径嵌入在 nuthatch 下未知的某个地方跨度>
【解决方案3】:

我为此创建了the Path Length Checker tool,这是一个不错的免费 G​​UI 应用程序,您可以使用它来查看给定目录中所有文件和目录的路径长度。

我还 written and blogged about a simple PowerShell script 用于获取文件和目录长度。它将输出文件的长度和路径,并可选择将其写入控制台。它不限于显示仅超过一定长度的文件(易于修改),而是按长度降序显示它们,因此仍然非常容易查看哪些路径超过了您的阈值。这里是:

$pathToScan = "C:\Some Folder"  # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:\temp\PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.

$writeToConsoleAsWell = $true   # Writing to the console will be much slower.
 
# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
    $filePath = $_.FullName
    $length = $_.FullNameLength
    $string = "$length : $filePath"
     
    # Write to the Console.
    if ($writeToConsoleAsWell) { Write-Host $string }
  
    #Write to the file.
    $stream.WriteLine($string)
}
$stream.Close()

【讨论】:

  • 有趣的脚本,但我仍然收到此错误:Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
  • 优秀的工具!!我有很多约会,想在 WD MyCloud 硬盘上创建备份。通过这个工具可以知道在 HDD 上创建文件夹结构的最大长度。谢谢。
  • 很棒的工具!我用它创建了一个脚本,能够找到路径超过 247 个字符的所有文件/文件夹,这是 Windows 中 Synology Drive Client 的限制。主要代码是PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248,而需要echo SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqlite 以编程方式获取共享文件夹。 (如果您对完整代码感兴趣,请随时询问)
  • 很棒的工具,谢谢。对于 2 个 Synology NAS 之间的 Rsync-Job,我应该知道所有文件名的长度超过 143 个字符。这不是整个路径长度,它只是每个文件名的最大长度。我怎么能找到这样的文件名?
  • 嘿 @PeterCo 你仍然可以使用上面的 PowerShell 脚本,但不要使用 $_.FullName,而是在任何地方用 $_.Name 替换它;这将为您提供文件名而不是完整路径。
【解决方案4】:

对于大于 260 的路径:
你可以使用:

Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}

14 个字符的示例:
查看路径长度:

Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}

获取大于 14 的路径:

Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}  

截图:

对于大于 10 的文件名:

Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}

截图:

【讨论】:

    【解决方案5】:

    来自http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/

    Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied
    

    第一部分只是遍历这个文件夹和子文件夹;使用-ErrorVariable AccessDenied 意味着将有问题的项目推入powershell 变量AccessDenied

    然后您可以像这样扫描变量

    $AccessDenied |
    Where-Object { $_.Exception -match "must be less than 260 characters" } |
    ForEach-Object { $_.TargetObject }
    

    如果您不关心这些文件(在某些情况下可能适用),只需删除 -ErrorVariable AccessDenied 部分。

    【讨论】:

    • 问题是,$_.TargetObject 不包含违反MAX_PATH文件 的完整路径,只有目录名称 和有问题的文件的父目录名。我正在寻找一个非 Robocopy 或 Subst 或 Xcopy 解决方案,当我找到一个可行的解决方案时会发布。
    【解决方案6】:

    作为最简单解决方案的改进,如果您不能或不想安装 Powershell,只需运行:

    dir /s /b | sort /r /+261 > out.txt
    

    或(更快):

    dir /s /b | sort /r /+261 /o out.txt
    

    超过 260 行的行将排在列表的顶部。请注意,您必须将 1 添加到 SORT 列参数 (/+n)。

    【讨论】:

    • 感谢您的改进。我的情况是我无法安装 Powershell(Windows 2003 盒子)。投票赞成
    • 你能详细解释一下为什么要加1吗?
    • 有没有办法按行长对输出文件进行排序?
    • @Xonatron , "而且行数超过 260"
    • 投了赞成票。我认为这也应该提到 SUBST 以缩短进入驱动器 ftw 的路径。
    【解决方案7】:

    我已经替代了此处使用 PowerShell 的其他好的答案,但我的也将列表保存到文件中。会在这里分享,以防其他人需要类似的东西。

    警告:代码会覆盖当前工作目录中的“longfilepath.txt”。我知道你不太可能已经有了,但以防万一!

    故意想在一行中:

    Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
    

    详细说明:

    1. 运行 PowerShell
    2. 遍历到要检查文件路径长度的目录(C:works)
    3. 复制粘贴代码【在PowerShell中右键粘贴,或者Alt + Space > E > P】
    4. 等到完成后再查看文件:cat longfilepath.txt | sort

    说明:

    Out-File longfilepath.txt ; – 创建(或覆盖)一个名为“longfilepath.txt”的空白文件。用分号分隔命令。

    cmd /c "dir /b /s /a" | – 在 PowerShell 上运行 dir 命令,/a 以显示所有文件,包括隐藏文件。 | 到管道。

    ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} – 对于每一行(表示为 $_),如果长度大于 250,则将该行附加到文件中。

    【讨论】:

      【解决方案8】:

      TLPD(“太长的路径目录”)是救了我的程序。 非常容易使用:

      https://sourceforge.net/projects/tlpd/

      【讨论】:

      • Chrome 将此下载标记为包含病毒
      【解决方案9】:

      疯狂的是,这个问题仍然是相关的。尽管 E235 给了我基础,但没有一个答案给了我我想要的东西。我还打印了名称的长度,以便更容易查看需要修剪的字符数。

      Get-ChildItem -Recurse | Where-Object {$_.FullName.Length -gt 260} | %{"{0} : {1}" -f $_.fullname.Length,$_.fullname }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        相关资源
        最近更新 更多