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


87

我在XP Windows脚本中使用xcopy递归复制目录。我一直收到“内存不足”错误,我知道这是因为我要复制的文件路径太长。我可以轻松地减少路径长度,但是不幸的是,我无法确定哪些文件违反了路径长度限制。复制的文件被打印到标准输出(我将其重定向到日志文件),但是错误消息被打印到终端,因此我什至无法估算出错误所在的目录。


Answers:


114

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

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


1
dir / s / b> out.txt可以很好地完成这项工作。谢谢。“'Get-ChildItem'不被识别为内部或外部命令,可操作程序或批处理文件。” 我想我没有功能。
WestHamster 2012年

1
@WestHamster,您必须在PowerShell控制台中运行该命令。
拉米A.13年

6
它将引发以下错误: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。这些正是我要查找的路径,但是我看不到整个路径!可以解决吗?
MiniGod 2015年

我是唯一无法使它正常工作的人吗?使用Win7 64位Home Premium,Powershell 2.0-当我创建一个带有长名称(240个字符)的测试文件,然后将其重命名为长名称的目录时,Get-ChildItems -r *停止查看该文件...仅dir /s /b适用为了我。
乔纳斯·海德堡

请参阅我的答案,以了解如何在Powershell中实现此目的,该方法允许您查找有问题的文件名(超过260个字符的文件名),或者忽略它们。
Jonno

31

为此,我创建了路径长度检查器工具,它是一个不错的免费GUI应用程序,您可以使用它来查看给定目录中所有文件和目录的路径长度。

我还写了一篇关于用于获取文件和目录长度的简单PowerShell脚本的博客,并发表了博客。它将输出文件的长度和路径,并有选择地将其写入控制台。它不限于显示仅超过一定长度的文件(很容易进行修改),而是按长度递减显示它们,因此仍然很容易查看哪些路径超出了阈值。这里是:

$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()

2
有趣的脚本,但我仍然遇到此错误: 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.
zkurtz 2014年

优秀的工具!我约会的时间很长,想在WD MyCloud HDD上创建备份。通过此工具,您知道了在HDD上创建文件夹结构的最大长度。谢谢。
NJMR '16

27

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

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

或(更快):

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

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


感谢您的完善。我的情况是我无法安装Powershell(Windows 2003框)。投UP
preOtep

您能否解释为什么必须更详细地添加1?
Xonatron

有没有一种方法可以按行长对输出文件进行排序?
Xonatron

@Xonatron,“且行长超过260”
崖壁

投票通过。我认为这也应该提到SUBST,以缩短进入驱动器ftw的路径。
cliffclof

6

我已经在这里替代了其他使用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:有效)
  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,则将该行附加到文件中。


2

您可以重定向stderr。

这里有更多说明,但有类似以下的命令:

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

重定向std输出和错误应该可以让我充分了解大文件在哪里。命令>文件2>&1
WestHamster,2012年

那将起作用,但是我的命令应该将错误分成一个单独的文件
SeanC

\\?\看起来也不错。我无法执行以下操作:xcopy / s \\?\ Q:\ nuthatch \\?\ Q:\ finch
WestHamster 2012年

嗯...似乎\\?\ 不适用于命令行。增加了使用另一种思路SUBST
SeanC

不幸的是,subst不会太有用,因为该命令的类型为:xcopy / sq:\ nuthatch q:\ finch <br/>并且长路径嵌入在
nuthatch

2

来自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解决方案,并在找到有效的解决方案时发布。
user66001


-2

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

屏幕截图:
在此处输入图片说明


4
您显然对这个问题一无所知。您提出的建议均无效。请阅读
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.