批量目录名过长

aji*_*ith 4 windows batch-file

我已经在堆栈溢出中问过这个问题,但没有得到任何人的回答。所以我也在这里问同样的问题。

我正在尝试制作一个程序,该程序将使用批处理脚本计算指定位置或当前位置中存在的所有文件夹的大小,并将其写入 .csv 文件

我在stackoverflow中关注了这个问题

/sf/ask/1519782631/

我的代码是

`@echo off
 setlocal disabledelayedexpansion
 set "folder=%~1"
 Set "Value=0"
 if not defined folder set "folder=%cd%"
  (for /d %%a in ("%folder%\*") do (
    set "size=0"
    for /f "tokens=3,5" %%b in ('dir /-c /a /w /s /x "%%~fa\*" ^| findstr /b /c:"  "')do if "%%~c"=="" set "size=%%~b"
   setlocal enabledelayedexpansion
   echo(%%~nxa , !size!
   endlocal
  ))>>foldersize.csv 
endlocal
exit /b`
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我收到一个错误

目录名“dir_name”太长

我已经知道 Windows 路径名的最大长度是 260 个字符,这可能是此错误的原因。

有什么办法可以解决这个问题吗??

预先感谢您的每一个回复。

Kev*_*gan 8

在 NTFS 分区上,最大路径长度约为 32,760 个字符(略小于 32,767 个)。但是,MAX-PATH 仍然是 260。比“MAX-PATH”更长的路径仍然可以访问,并且被称为“扩展长度路径”。

根据此页面:最大路径长度限制

要指定扩展长度的路径,请使用“\\?\”前缀。例如,“\\?\D:\非常长的路径”。

还要记住,“扩展长度路径”始终是“绝对”路径。您不能指定“扩展长度路径”的“相对形式”。

我还没有尝试运行您的确切脚本,但我已经从命令提示符下进行了一些测试,看起来它是可行的。

例如:

@for /f "usebackq delims=" %f in (`dir /s /b "\\?\c:\Blah"`) do @echo %f
Run Code Online (Sandbox Code Playgroud)

返回一个列表,如:

\\?\c:\Blah\test
\\?\c:\Blah\test\aaa
\\?\c:\Blah\test\bbb
\\?\c:\Blah\test\aaa\folder1
\\?\c:\Blah\test\aaa\folder2
\\?\c:\Blah\test\aaa\folder1\File1.txt
\\?\c:\Blah\test\aaa\folder1\File2.txt
\\?\c:\Blah\test\aaa\folder2\File1.txt
\\?\c:\Blah\test\aaa\folder2\File2.txt
\\?\c:\Blah\test\bbb\folder1
\\?\c:\Blah\test\bbb\folder2
\\?\c:\Blah\test\bbb\folder1\Diff.txt
\\?\c:\Blah\test\bbb\folder1\Same.txt
\\?\c:\Blah\test\bbb\folder2\Diff.txt
\\?\c:\Blah\test\bbb\folder2\Same.txt
Run Code Online (Sandbox Code Playgroud)

和:

C:>dir /-c /a /w /s /x "\\?\c:\Blah" | findstr /b /c:"  "
Run Code Online (Sandbox Code Playgroud)

返回:

           0 File(s)              0 bytes
           0 File(s)              0 bytes
           2 File(s)            660 bytes
           2 File(s)            654 bytes
           0 File(s)              0 bytes
           2 File(s)            654 bytes
           2 File(s)            660 bytes
 Total Files Listed:
           8 File(s)           2628 bytes
          20 Dir(s)      3268722688 bytes free
Run Code Online (Sandbox Code Playgroud)

这看起来不像你所需要的,所以你的“dir/findstr”命令需要一些调整。

我没有任何超过 260 个字符的路径\文件,所以我不知道“很长”的路径会发生什么,但它应该可以工作。


如果您使用的路径是 UNC 路径,则上面链接的页面会显示:

“\\?\”前缀也可用于根据通用命名约定 (UNC) 构造的路径。要使用 UNC 指定这样的路径,请使用“\\?\UNC\”前缀。例如,
“\\?\UNC\server\share”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。

一个适合您在评论中给出的 UNC 路径的示例,应如下指定:

dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个老问题,但正如 ajith 所说 - 这些都不适合我,我在它前面加上了 \\?\ 和 \\?\UNC\ 并将其映射到 K: 驱动器并执行了 \\?\K: \ 所有这些仍然导致文件名或扩展名太长 (2认同)