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

我在Windows XP脚本中使用xcopyrecursion复制目录。 我不断收到一个'内存不足'的错误,我知道是因为我试图复制一个文件太长的path。 我可以很容易地减lesspath长度,但不幸的是我不能确定哪些文件违反path长度限制。 被复制的文件被打印到标准输出(我正在redirect到一个日志文件),但是错误消息被打印到terminal,所以我甚至不能确定错误的大概是哪个目录。

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

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

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

我还写了一篇简单的PowerShell脚本来获取文件和目录的长度。 它将输出文件的长度和path,也可以将其写入控制台。 它不限制显示仅超过一定长度的文件(对其进行简单的修改),而是将其显示为按长度递减的文件,因此,查看哪些path超出阈值仍然是非常容易的。 这里是:

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

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

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

或(更快):

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

超过260的线路将达到上市的顶部。 请注意,您必须将1添加到SORT列参数(/ + n)。

我已经在这里使用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. 遍历你想要检查文件path长度的目录(C:works)
  3. 复制并粘贴代码[右键单击以粘贴到PowerShell中,或Alt + Space> E> P]
  4. 等待完成,然后查看文件: cat longfilepath.txt | sort cat longfilepath.txt | sort

说明:

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

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

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

你可以redirectstderr。

更多的解释在这里 ,但有一个像这样的命令:

 MyCommand >log.txt 2>errors.txt 

应该抓住你正在寻找的数据。

此外,作为一个窍门,如果path的前缀是\\?\ ( msdn ),Windows会绕过这个限制。

另一个窍门,如果你有一个根或目的地开始一个很长的path,也许SUBST将帮助:

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

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

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

第一部分只是遍历这个和子文件夹; 使用-ErrorVariable AccessDenied意味着将违规项目推入-ErrorVariable AccessDeniedvariablesAccessDenied

然后你可以像这样扫描variables

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

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

对于大于260的path:
您可以使用:

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

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

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

获取path大于14:

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

截图:
在这里输入图像说明

对于大于10的文件名:

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

截图:
在这里输入图像说明