目录名称批量太长


4

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

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

我在stackoverflow中关注了这个问题

https://stackoverflow.com/questions/21711180/how-to-list-all-folder-with-size-via-batch-file

我的代码是

`@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`

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

目录名“dir_name”太长

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

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

每个回复都要提前感谢。


你可以使用旧式8.3命名约定来完成它,就像你编写代码在Windows 3.1上运行一样吗?
fixer1234 2014年

Answers:


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

返回如下列表:

\\?\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

和:

C:>dir /-c /a /w /s /x "\\?\c:\Blah" | findstr /b /c:"  "

返回:

           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

这看起来不像你需要的,所以你的“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:" "

谢谢您的回复。在我的情况下,位置是一个网络地址,所以如果我将这些位置放入你给出的命令,它将变成像dir / -c / a / w / s / x“\\?\\\ 10.91.49.10 \ folder1 \ folder2“| findstr / b / c:“”当我运行此命令时,我收到一个错误,如文件名,目录名或卷标语法不正确
ajith

@ajith - 我在答案中添加了更多来解释这个...要指定一个UNC路径,你需要使用前缀:"\\?\UNC\"像这样:dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan 2014年

1
即使我按照你说的那样更改了命令(添加了\\?\ UNC \),我仍然得到相同的错误文件名,目录名或卷标语法不正确
ajith 2014年

2
我知道这是一个老问题,但正如ajith所说 - 这些都不适合我,我用\\?\和\\?\ UNC \作为前缀并将其映射到K:drive并做了\\?\ K: \所有这些仍然导致文件名或扩展名太长
StanM 2015年

0

假设保存信息的物理服务器访问相同文件夹没有任何问题,我看到它工作的唯一方法是将驱动器号映射到目录遍历开始的文件夹,删除计算机地址并从路径长度共享名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.