如何在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}}
详细说明:
- 运行PowerShell
- 遍历你想要检查文件path长度的目录(C:works)
- 复制并粘贴代码[右键单击以粘贴到PowerShell中,或Alt + Space> E> P]
- 等待完成,然后查看文件:
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 AccessDenied
variablesAccessDenied
。
然后你可以像这样扫描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}
截图: