我在XP Windows脚本中使用xcopy递归复制目录。我一直收到“内存不足”错误,我知道这是因为我要复制的文件路径太长。我可以轻松地减少路径长度,但是不幸的是,我无法确定哪些文件违反了路径长度限制。复制的文件被打印到标准输出(我将其重定向到日志文件),但是错误消息被打印到终端,因此我什至无法估算出错误所在的目录。
Answers:
做一个dir /s /b > out.txt
,然后在260位置添加一个导向
在PowerShell中 cmd /c dir /s /b |? {$_.length -gt 260}
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
。这些正是我要查找的路径,但是我看不到整个路径!可以解决吗?
Get-ChildItems -r *
停止查看该文件...仅dir /s /b
适用为了我。
为此,我创建了路径长度检查器工具,它是一个不错的免费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()
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.
作为最简单解决方案的改进,如果您不能或不想安装Powershell,请运行:
dir /s /b | sort /r /+261 > out.txt
或(更快):
dir /s /b | sort /r /+261 /o out.txt
超过260行的行将到达列表的顶部。请注意,必须在SORT列参数(/ + n)上加上1。
我已经在这里替代了其他使用PowerShell的好答案,但是我的也将列表保存到文件中。如果其他人需要这样的东西,将在这里共享。
警告:代码将覆盖当前工作目录中的“ longfilepath.txt”。我知道您不太可能已经拥有一个,但以防万一!
特意在单行中显示它:
Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
详细说明:
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,则将该行附加到文件中。
\\?\
不适用于命令行。增加了使用另一种思路SUBST
来自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解决方案,并在找到有效的解决方案时发布。
TLPD(“路径目录太长”)是保存我的程序。非常容易使用:
对于大于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}
屏幕截图: