Windows 文件 PathTooLongException:批处理文件识别长度超过 255 的文件路径

问题描述 投票:0回答:2

问题 我有一些超过

length=255
的文件路径,显然,在我的 Windows 7 计算机上进行文件同步操作期间无法处理(并且似乎会中断整个操作)。遇到的异常是 PathTooLongException

所需的解决方案: 我想创建一个批处理文件来识别超过255的文件路径,并将它们输出到

.txt
文件(用于诊断检查)

更新 下面接受的解决方案非常有效。

这是我在这里发表的第一篇文章;请善待

batch-file windows-7 filepath pathtoolongexception
2个回答
1
投票

您想要仅路径(超过 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


0
投票

此解决方案不会特别针对 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
© www.soinside.com 2019 - 2024. All rights reserved.