Board logo

标题: [文本处理] [已解决]批处理如何将短路径还原成完整的路径? [打印本页]

作者: ttszuo    时间: 2015-8-10 12:58     标题: [已解决]批处理如何将短路径还原成完整的路径?

本帖最后由 pcl_test 于 2016-7-10 22:12 编辑

TEMP的变量路径为C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
如何通过C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp这样的短路径来获取长路径,同样的文件的长路径该怎么通过短路径来获取
作者: WHY    时间: 2015-8-10 14:29

本帖最后由 WHY 于 2015-8-11 11:30 编辑
  1. @echo off
  2. set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
  3. for %%i in ("%strShortPath%") do (
  4.     pushd %%~di\
  5.     if exist "%%~fi\" (
  6.         for /d /r %%j in ("%%~nxi?") do (
  7.             if /i "%%~sj"=="%%~fi" set "strFullPath=%%~fj" & goto :message
  8.         )
  9.     ) else if exist "%%~fi" (
  10.         for /r %%j in ("%%~nxi?") do (
  11.             if /i "%%~sj"=="%%~fi" set "strFullPath=%%~fj" & goto :message
  12.         )
  13.     ) else set "strFullPath=NULL"
  14. )
  15. :message
  16. echo %strFullPath%
  17. pause
复制代码

作者: ttszuo    时间: 2015-8-12 13:00

回复 2# WHY
有没有其他第三方工具也行,的这个的执行速度实在是太慢了
作者: WHY    时间: 2015-8-12 14:02

本帖最后由 WHY 于 2015-8-12 18:48 编辑
  1. @echo off
  2. set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
  3. for /f "tokens=1*delims=|" %%i in ("%strShortPath%|%strShortPath%\..") do (
  4.     if exist "%%~fi\" (
  5.         >~tmp.vbs echo WScript.Echo CreateObject("Shell.Application"^).NameSpace("%%~fi"^).Self.Path
  6.     ) else if exist "%%~fi" (
  7.         >~tmp.vbs echo WScript.Echo CreateObject("Shell.Application"^).NameSpace("%%~fj"^).ParseName("%%~nxi"^).Path
  8.     ) else echo NULL&pause & exit
  9. )
  10. for /f "delims=" %%i in ('cscript //nologo ~tmp.vbs') do set "strFullPath=%%~fi"
  11. del ~tmp.vbs
  12. echo %strFullPath%
  13. pause
复制代码

作者: CrLf    时间: 2015-8-12 14:34

本帖最后由 CrLf 于 2015-8-12 18:59 编辑
  1. @echo off
  2. set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
  3. pushd "%strShortPath%\.."
  4. for %%a in ("%strShortPath%") do set "strFullPath=%cd%\%%~nxa"
  5. popd
  6. echo %strFullPath%
  7. pause
复制代码

作者: bailong360    时间: 2015-8-12 15:11

本帖最后由 bailong360 于 2015-8-12 19:19 编辑
  1. @echo off
  2. set ShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
  3. call :GetLongPath LongPath "%ShortPath%"
  4. echo %ShortPath%
  5. echo %LongPath%
  6. pause
  7. :GetLongPath [RetVar] [ShortPath]   by bailong360 @bbs.bathome.net
  8. @echo off&setlocal enabledelayedexpansion&set "S=%~2"&set "S=!S:\= !"
  9. (for %%i in (!S!) do set /a n+=1&set "D!n!=%%i")&set "D1=!D1!\"&set /a n-=1
  10. (for /l %%i in (1 1 !n!) do (cd /d "!D%%i!"&set /a n=%%i+1
  11. for %%j in (!n!) do (set "t=!D%%j:~,-1!?"&for /d %%k in (!t!) do (
  12. if "%%~snxk"=="!D%%j!" set "L=!L!\%%~k"))))&if not exist "%~2\" (for %%i in (!n!) do (
  13. set "t=!D%%i:~,-1!?"&for /r %%j in (!t!) do if "%%~snxj"=="!D%%i!" set "L=!L!\%%~nxj"))
  14. endlocal&set "%~1=%D1:~,2%%L%"&goto :eof
复制代码
参考资料:http://stackoverflow.com/questio ... rom-short-file-name
已修改,代码虽然看起来像屎一样,但效率还是挺高的
作者: bailong360    时间: 2015-8-12 18:21

回复 5# CrLf
巡查大人....XP 32位专业版 用户测试后表示行不通..
作者: WHY    时间: 2015-8-12 18:50

本帖最后由 WHY 于 2015-8-12 19:53 编辑

我来个递归方案:
  1. @echo off
  2. set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
  3. if not exist "%strShortPath%" echo NULL&pause & exit
  4. call :getFullPath "%strShortPath%"
  5. for %%i in ("%strFullPath%.") do set "strFullPath=%%~fi"
  6. echo %strfullPath%
  7. pause & exit
  8. :getFullPath
  9. for %%i in ("%~1\..") do (
  10.     cd /d "%%~fi"
  11.     for /f "delims=" %%j in ('dir /a /b "%~1?"') do (
  12.         if /i "%%~snxj"=="%~nx1" (
  13.             set "strFullPath=%%j\%strFullPath%"
  14.             if /i not "%%~fi"=="%~d1\" call :getFullPath "%%~fi"
  15.         )
  16.     )
  17. )
复制代码

作者: CrLf    时间: 2015-8-12 19:00

回复 7# bailong360


    忘了加 echo 了,现在呢?
作者: bailong360    时间: 2015-8-12 19:08

回复 9# CrLf
不行
话说我忘记判定为文件的情况了....
作者: ttszuo    时间: 2015-8-13 10:02

本帖最后由 ttszuo 于 2015-8-13 10:04 编辑

昨天突然想到可以用dir+*来获取文件路径,不过代码比较多需要简化一下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "Temp1=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
  4. set Temp1=%Temp1:\= %
  5. for %%a in (%Temp1%) do (
  6.     set name=%%a
  7.     set name1=!name:~-2,1!
  8.     set name2=!name:~0,1!
  9.     cd /d "!flies!"
  10.     if "!name1!"=="~" (
  11.         for /f "delims=" %%i in ('dir /b/a "!flies!!name2!*"') do (
  12.             if "%%~sfi"=="!flies1!!name!" (
  13.                 set "flies=%%~fi\"
  14.                 set "flies1=%%~sfi\"
  15.             )
  16.         )
  17.     ) else (
  18.         set "flies=!flies!!name!\"
  19.         set "flies1=!flies1!!name!\"
  20.     )
  21. )
  22. if not exist "!flies!" set flies=!flies:~0,-1!
  23. echo.!flies!
  24. pause
复制代码

作者: ttszuo    时间: 2015-8-13 10:11

回复 5# CrLf
.....我的也是xp系统,还是短路径输出




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2