我想知道是否有人设计出一种在 NT 中批量计算给定文件夹中路径长度的有效方法。这对于识别无法成功存档到光学介质的文件和文件夹是必要的,尽管 NTFS 现在支持最多 32,767 个字符的路径长度,但仍然强制执行 260 个字符的路径限制。
我一直在使用一个批处理脚本,该脚本的工作原理是回显文件的每个完整路径,测量文件的大小,然后减去 2 以获得路径中的字符数。这对于文件数较少的情况很有效,但对于文件数较多的情况则需要很长时间才能完成。理想情况下,我希望某个脚本的运行速度几乎与“dir”命令本身一样快。
@ECHO 关闭 设置本地已启用延迟扩展 设置限制=%~1 echo 发现超出 !Limit! 的路径 回声 =========================================== 输入 NUL > "!temp!\tabulator.txt" FOR /F “tokens=1 delims=” %%A IN ('dir /o:-n /b /s') DO ( 设置测试=%%A 调用设置测试=%%Test:~%Limit%%%。 如果!测试!NEQ。( 输入 NUL > "!temp!\pathlengthdeterminationtemp.txt" 回显 %%A > "!temp!\pathlengthdeterminationtemp.txt" FOR /F“tokens=1 delims=” %%H IN ('dir /s /o /b“!temp!\pathlengthdeterminationtemp.txt”') DO set StrLen=%%~zH del "!temp!\pathlengthdeterminationtemp.txt" 设置/a StrLen=!StrLen!-2 回声!StrLen!,%% A>>“!temp!\tabulator.txt” ) ) 排序“!temp!\tabulator.txt”/O“!temp!\tabulator1.txt” 删除“!temp!\tabulator.txt” 输入“!temp!\tabulator1.txt” 删除“!temp!\tabulator1.txt” 端到端
答案1
批处理文件中没有内置命令来确定字符串的长度。它必然涉及一些丑陋的黑客行为,例如写入文件。但是,检查字符串是否超过固定长度(例如 260 个字符的限制)相对容易。以下脚本抓取 260 个字符的子字符串并测试相等性。如果两个变量不匹配,则认为路径太长并打印出来。
@echo off
setlocal enabledelayedexpansion
for /F "tokens=1 delims=" %%i in ('dir /o:-n /b /s') do (
set filename=%%i
set part=!filename:~0,260!
if !filename! NEQ !part! echo !filename!
)
答案2
要检查环境变量的长度,您可以执行类似以下操作:
set a=1234567890123
if [%a:~0,-12%]==[] (
echo a is shorter than 13
) else (
echo %a% is longer than 12
)
表达式返回变量%a:~0,-12%
除最后一个字符之外的所有字符。12
a
输入set /?
以获取详细信息。
但是,我不确定这是否也能在 下工作NT
。我已经CMD
在 下将其作为脚本进行了测试Windows 7
。
答案3
您可以使用正则表达式通过程序过滤 DIR 输出。
findstr 可以做到这一点,但不幸的是,正则表达式非常有限,它仅支持最多 254 个字符的搜索模式。
代码可以是:
@echo off
setlocal enabledelayedexpansion
set "_LIMIT_=%~1"
set _PATTERN_=
for /l %%n in (1,1,%_LIMIT_%) do (set "_PATTERN_=!_PATTERN_!.")
dir /o:-n /b /s | findstr /r "/c:%_PATTERN_%"
如果你不介意使用第三方程序,你可以使用 grep。这很容易:
@echo off
setlocal
set "_LIMIT_=%~1"
dir /o:-n /b /s | grep -E .{%_LIMIT_%}