用于确定文件夹中路径长度的快速 NT 批处理脚本

用于确定文件夹中路径长度的快速 NT 批处理脚本

我想知道是否有人设计出一种在 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%除最后一个字符之外的所有字符。12a

输入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_%}

相关内容