代码之家  ›  专栏  ›  技术社区  ›  WestHamster

如何在Windows中查找路径长度大于260个字符的文件?

  •  99
  • WestHamster  · 技术社区  · 12 年前

    我在XPwindows脚本中使用xcopy递归地复制目录。我一直收到“内存不足”错误,我知道这是因为我试图复制的文件的路径太长。我可以很容易地减少路径长度,但不幸的是,我无法确定哪些文件违反了路径长度限制。复制的文件被打印到标准输出(我将其重定向到日志文件),但错误消息被打印到终端,所以我甚至无法大致计算出错误发生在哪个目录。

    9 回复  |  直到 12 年前
        1
  •  126
  •   rerun    8 年前

    做一个 dir /s /b > out.txt 然后在位置260添加引导件

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

        2
  •  40
  •   SimplyInk LuizLoyola    3 年前

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

    我也有 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()
    
        3
  •  31
  •   Chungalin    8 年前

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

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

    或(更快):

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

    而超过260条的线路将排在列表的首位。请注意,必须在SORT列参数(/+n)中添加1。

        4
  •  9
  •   Rani Kheir    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,则将该行附加到文件中。

        5
  •  3
  •   Jonno    9 年前

    从…起 http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ 以下为:

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

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

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

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

    如果您不关心这些文件(在某些情况下可能适用),只需删除 -错误变量访问被拒绝 部分

        6
  •  2
  •   SeanC    12 年前

    您可以重定向stderr。

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

    MyCommand >log.txt 2>errors.txt
    

    应该获取您正在查找的数据。

    此外,作为一种技巧,如果路径前缀为 \\?\ ( msdn )

    另一个技巧是,如果你有一个以长路径开始的根或目的地,也许 SUBST 将有助于:

    SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
    Xcopy Q:\ "d:\Where it needs to go" /s /e
    SUBST Q: /D
    
        7
  •  2
  •   pollaris    6 年前

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

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

        8
  •  1
  •   housten    3 年前

    奇怪的是,这个问题仍然很重要。尽管E235给了我基础,但没有一个答案能完全满足我的需求。我还打印出了名字的长度,这样可以更容易地看到一个人需要修剪多少个字符。

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

    对于大于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}  
    

    屏幕截图:
    enter image description here

    对于大于10的文件名:

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

    屏幕截图:
    enter image description here