我已经问过了问题在 stack overflow 中,但没有得到任何人的回答。所以我也在这里问同样的问题。
我正在尝试制作一个程序,使用批处理脚本计算指定位置或当前位置存在的所有文件夹的大小,并将其写入 .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 个字符,这可能是导致此错误的原因。
有什么办法可以解决这个问题吗?
提前感谢每一个回复。
答案1
在 NTFS 分区上,最大路径长度约为 32,760 个字符(略小于 32,767)。但是,MAX-PATH 仍为 260。长度超过“MAX-PATH”的路径仍可访问,并称为“扩展长度路径”。
根据此页面:最大路径长度限制
要指定扩展长度的路径,请使用“\\?\”前缀。例如,“\\?\D:\very long path”。
还请记住,“扩展长度路径”始终是“绝对”路径。您无法指定“扩展长度路径”的“相对形式”。
我还没有尝试运行您的确切脚本,但是我已经从命令提示符进行了一些测试并且看起来它是可行的。
例如:
@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:" "
答案2
假设保存信息的物理服务器在访问相同文件夹时没有任何问题,我看到的唯一可行的方法是将驱动器号映射到目录遍历过程开始的文件夹,并从路径长度中删除计算机地址和共享名称。