问题 我有一些超过
length=255
的文件路径,显然,在我的 Windows 7 计算机上进行文件同步操作期间无法处理(并且似乎会中断整个操作)。遇到的异常是 PathTooLongException
所需的解决方案: 我想创建一个批处理文件来识别超过255的文件路径,并将它们输出到
.txt
文件(用于诊断检查)
更新 下面接受的解决方案非常有效。
这是我在这里发表的第一篇文章;请善待
您想要仅路径(超过 255 个字符的目录路径)还是组合文件名和文件夹路径
仅文件夹:
@(Setlocal enabledelayedexpansion
Echo off
Set "_Root=D:\"
Set "_ResultFile=D:\PathsOver255Chars.txt"
)
CALL :Main
( Endlocal
Exit /B
)
:Main
For /F "Tokens=*" %%_ IN ('
Dir /B /S /AD "%_Root%*"
') DO (
SET "_CheckLen=%%_"
IF /I !_CheckLen! NEQ !_CheckLen:~-255! (
ECHO=%%_>>"%_ResultFile%"
)
)
GOTO :EOF
仅文件:
@(Setlocal enabledelayedexpansion
Echo off
Set "_Root=D:\"
Set "_ResultFile=D:\PathsOver255Chars.txt"
)
CALL :Main
( Endlocal
Exit /B
)
:Main
For /F "Tokens=*" %%_ IN ('
Dir /B /S /A-D-S-H "%_Root%*"
') DO (
SET "_CheckLen=%%_"
IF /I !_CheckLen! NEQ !_CheckLen:~-255! (
ECHO=%%_>>"%_ResultFile%"
)
)
GOTO :EOF
文件夹和文件
@(Setlocal enabledelayedexpansion
Echo off
Set "_Root=D:\"
Set "_ResultFile=D:\PathsOver255Chars.txt"
)
CALL :Main
( Endlocal
Exit /B
)
:Main
For /F "Tokens=*" %%_ IN ('
Dir /B /S "%_Root%*"
') DO (
SET "_CheckLen=%%_"
IF /I !_CheckLen! NEQ !_CheckLen:~-255! (
ECHO=%%_>>"%_ResultFile%"
)
)
GOTO :EOF
此解决方案不会特别针对 255 个以上字符进行测试,但仍然会在长路径中进行测试,特别是在 cmd.exe 内的脚本中。
似乎 stackoverflow 错误地处理了复制粘贴代码中的制表字符(并丢失了其他字符,如
\x01
或 \x04
),因此如果直接通过 CTRL+C 复制,下面的代码可能不起作用。
优点:
缺点:
@echo off
setlocal
set "FILE_PATH=%~1"
if not defined FILE_PATH exit /b 1
for /F "eol= tokens=* delims=" %%i in ("%FILE_PATH%\.") do ^
for /F "eol= tokens=* delims=" %%j in ("%%~dpi.") do ( set "FILE_PATH=%%~fi" & set "FILE_DIR=%%~fj" )
if "%FILE_PATH:~0,4%" == "\\?\" set "FILE_PATH=%FILE_PATH:~4%"
echo "FILE_PATH=%FILE_PATH%"
rem for a path
if exist "\\?\%FILE_PATH%" if exist "%FILE_PATH%" ( echo.* a short path) else echo.a long path
rem for a file path
if exist "\\?\%FILE_PATH%" if not exist "\\?\%FILE_PATH%\*" if exist "%FILE_PATH%" ( echo.* a short file path) else echo.a long file path
rem for a directory path
if exist "\\?\%FILE_PATH%\*" if exist "%FILE_PATH%" ( echo.* a short directory path) else echo.a long directory path