找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 3491|回复: 9

[其他] 找出超长路径的文件夹的小工具(CMD)

[复制链接]
发表于 2025-9-4 08:44:37 | 显示全部楼层 |阅读模式
本帖最后由 hnfeng 于 2025-9-11 17:21 编辑

Windows 传统的路径长度限制是260个字符。目前新的系统支持32,767个字符的最大路径。但是如果如果路径超过260个字符,可能影响一些程序的运行,有的甚至没有错误提示,但是确实没正确运行。
该小程序就是找出文件夹中超过指定长度的路径,或者只找出最长的路径。

升级改善一下下:

功能:列出指定文件夹及其子文件夹的路径长度的路径或最长的路径
       (理论上路径长度最多可支持约 32,767 个字符)
  1. ================================================================
  2. List Longer Folder_Path(CMD),  Version: 1.0

  3. Usage:
  4. ----------------------------------------------------------------
  5. LongerPath.exe /?
  6. LongerPath.exe <Dir> [MinPathLong|/max] [OutputFile]

  7. Example:
  8. ----------------------------------------------------------------
  9. LongerPath.exe c:\Demo
  10. LongerPath.exe c:\Demo Out.txt
  11. LongerPath.exe c:\Demo /max Out.txt
  12. LongerPath.exe "c:\Demo abc" 245 Out.txt
  13. LongerPath.exe . /max
  14. LongerPath.exe .\Dir1\Dir2 245 Out.txt
  15. LongerPath.exe \\192.168.1.1\share\Dir1 /max
  16. LongerPath.exe \\Server\share\Dir1 /max
  17. LongerPath.exe \\?\c:\Demo\very\long\path /max
  18. LongerPath.exe \\?\UNC\192.168.1.1\share\very\long\path /max
  19. ================================================================
复制代码
第1个参数:要查询的文件夹路径。可以是:
    c:\Demo                   指定文件夹路径
    "c:\Demo demo\"           有空格的文件夹路径
    .                         只有一个“.”,会当做当前文件夹路径处理(可用%cd%表示当前文件夹)
    .\Demo                    以“.\”开头的,会把开头的“.”替换为当前文件夹路径
    \\?\c:\Demo               可以支持超长路径前缀(本地或映射的网络盘,只适用于绝对路径)
    \\?\UNC\192.168.1.1\share  或
    \\?\UNC\Server\share      可以支持超长网络共享路径前缀(其实程序内部是自动添加前缀来处理的)

后面的可选参数(最多只能有3个参数):
    如果第1个参数是“.”或以“.\”开头的,默认输出文件名为 Log.log
    如果第1个参数是普通的路径,默认输出文件名是路径中最后的文件夹名加.log后缀
    如果第1个参数是个磁盘符(例如D:),默认输出文件名为 D_Drive.log
    如果有满足文件名格式的参数(如 abc123.txt),就指定为输出文件名
        输出文件仅保存在当前/工作文件夹。
        输出文件名的要求:不含“/”,不含不允许用于文件名的字符、首字符不可以是“.”或空格、
        尾字符不可以是“.”、不可以含有连续的点。如“..”。如果中间含有空格,需置于英文双引号内
        程序会判断输出文件名是否合规
    如果有“纯数字”的参数,则仅记录路径长度大于等于这个数的路径
    如果有“/max”参数,则只记录最长的路径
        “纯数字”和“/max”不能同时使用
        两个参数都缺省时:输出所有路径

Errorlevel: 正常运行结束:      0
            有错误时或显示帮助:1



https://pan.baidu.com/s/10sXRMq4no3k3jjg0fsDfWw?pwd=1234

程序由较小众的语言编写,可能被少数防毒软件(尤其是MS的)误报。用与不用您自己决定。
 楼主| 发表于 2025-9-4 08:45:46 | 显示全部楼层
据说,Windows 传统的路径长度限制(260 字符,即 MAX_PATH)源于历史原因。C:\ + 255 个字符的文件名 + 终止空字符。这个限制影响了大多数旧的应用程序和 API。

貌似,从 Windows 10 版本 1607 开始,微软允许应用程序通过在其路径前添加 \\?\ 前缀以解除 MAX_PATH 限制,从而支持超长路径。

大概,使用正确的方法后,理论上路径长度最多可支持约 32,767 个字符(Windows API 的最大路径限制)。

听说,较旧版本的 Windows 10 需要手动开启超长路径支持,有下面的方法:

使用组策略:
    计算机配置-管理模版-系统-文件系统,启用右侧的“启用 Win32 长路径”

修改注册表:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v "LongPathsEnabled" /t REG_DWORD /d 1 /f

或者导入reg文件:
Enable_Long_Paths.reg 文件内容:
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
  3. "LongPathsEnabled"=dword:00000001

复制代码
或许,更改后需要重启计算机才能生效。

此功能仅适用于:Windows 10 版本 1607 或更高版本, Windows Server 2016 或更高版本

好像,较新的Windows10/11 默认就已经支持超长路径了

我不懂电脑,以上纯属道听途说。请读者自己甄别。
发表于 2025-9-4 10:33:05 | 显示全部楼层
感谢分享,只是体积900多k挺大的
 楼主| 发表于 2025-9-4 11:03:09 | 显示全部楼层
感谢分享,只是体积900多k挺大的
HalloWord 发表于 2025-9-4 10:33



    UPX压缩后,误报率会提高,所以没有进行压缩

用UPX压缩后是430KB
发表于 2025-9-5 10:15:34 | 显示全部楼层
回复 4# hnfeng


    嗯嗯,好像不是单纯的exe,用upx压缩也挺奇怪的,很好奇用的是啥小众语言
 楼主| 发表于 2025-9-11 17:33:50 | 显示全部楼层
升级改善了一下下。有需要的网友可以重新下载
发表于 2025-9-14 16:44:01 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-14 16:55 编辑


用批处分别调用 powershell, jscript, gawk 功能练了一把本题,即在当前目录(包含子目录)下获取最长路径及其长度值,实测结果是 gawk 效率最高,jscript 次之...

一。bat+powershell 版(存为 test1.bat 运行)

  1. @echo off &dir /b/s/ad>#.$
  2. powershell "$m=1;(gc '#.$')|%%{if($m -lt $_.length){$m=$_.length;$z=$_}};'最长路径及其长度:'+$z+' 》'+$m"
  3. del /q "#.$" &pause&exit/b
复制代码
二。bat+jscript 版(存为 test2.bat 运行)

  1. 2>1/* ::
  2. @echo off &dir /b/s/ad|cscript /nologo /e:jscript "%~f0"
  3. pause&exit/b */
  4. ws=WSH.stdin,nmax=1;
  5. while (!ws.atendofstream) {
  6.    s=ws.readline(), n=s.length;
  7.    if (n>nmax) nmax=n, smax=s; }
  8. WSH.echo('最长路径及其长度:'+smax+' 》'+nmax), WSH.quit();
复制代码
三。bat+gawk 版(存为 test3.bat 运行)本坛第三方下载 http://bcn.bathome.net/s/tool/index.html?key=gawk 落地即用,与批处脚本同目录

  1. @echo off &dir /b/s/ad>#.$
  2. gawk "{if(length(max)<length())max=$0}END{printf "最长路径及其长度:%%s 》%%d\n",max,length(max)}" "#.$">con
  3. del /q "#.$" &pause&exit/b
复制代码
 楼主| 发表于 2025-9-15 08:44:01 | 显示全部楼层
回复 7# aloha20200628

高手就是厉害   

只是在较旧的服务器上,一些项目文件夹里面可能有数百万个文件夹路径,有些可能超长, 所以 Dir /b /s /ad 产生的 #.$ 可能很庞大,需要的时间也可能较长,所以一开始就没敢使用 Dir /b /s /ad 。
谢谢指导
发表于 2025-9-17 14:22:03 | 显示全部楼层
回复 8# hnfeng


   可以用 for /r
发表于 2025-9-17 14:56:50 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /r %%i in (.) do (
  5.         set str=%%i
  6.         if "!str:~260,1!" neq "" (
  7.                 echo %%i
  8.         )
  9. )
  10. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 19:19 , Processed in 0.020926 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表