标题: [文本处理] [已解决]批处理如何将短路径还原成完整的路径? [打印本页]
作者: 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 编辑
- @echo off
- set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
-
- for %%i in ("%strShortPath%") do (
- pushd %%~di\
- if exist "%%~fi\" (
- for /d /r %%j in ("%%~nxi?") do (
- if /i "%%~sj"=="%%~fi" set "strFullPath=%%~fj" & goto :message
- )
- ) else if exist "%%~fi" (
- for /r %%j in ("%%~nxi?") do (
- if /i "%%~sj"=="%%~fi" set "strFullPath=%%~fj" & goto :message
- )
- ) else set "strFullPath=NULL"
- )
-
- :message
- echo %strFullPath%
- pause
复制代码
作者: ttszuo 时间: 2015-8-12 13:00
回复 2# WHY
有没有其他第三方工具也行,的这个的执行速度实在是太慢了
作者: WHY 时间: 2015-8-12 14:02
本帖最后由 WHY 于 2015-8-12 18:48 编辑
- @echo off
- set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
-
- for /f "tokens=1*delims=|" %%i in ("%strShortPath%|%strShortPath%\..") do (
- if exist "%%~fi\" (
- >~tmp.vbs echo WScript.Echo CreateObject("Shell.Application"^).NameSpace("%%~fi"^).Self.Path
- ) else if exist "%%~fi" (
- >~tmp.vbs echo WScript.Echo CreateObject("Shell.Application"^).NameSpace("%%~fj"^).ParseName("%%~nxi"^).Path
- ) else echo NULL&pause & exit
- )
-
- for /f "delims=" %%i in ('cscript //nologo ~tmp.vbs') do set "strFullPath=%%~fi"
- del ~tmp.vbs
- echo %strFullPath%
- pause
复制代码
作者: CrLf 时间: 2015-8-12 14:34
本帖最后由 CrLf 于 2015-8-12 18:59 编辑
- @echo off
- set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
-
- pushd "%strShortPath%\.."
- for %%a in ("%strShortPath%") do set "strFullPath=%cd%\%%~nxa"
- popd
-
- echo %strFullPath%
-
- pause
复制代码
作者: bailong360 时间: 2015-8-12 15:11
本帖最后由 bailong360 于 2015-8-12 19:19 编辑
- @echo off
- set ShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
- call :GetLongPath LongPath "%ShortPath%"
- echo %ShortPath%
- echo %LongPath%
- pause
- :GetLongPath [RetVar] [ShortPath] by bailong360 @bbs.bathome.net
- @echo off&setlocal enabledelayedexpansion&set "S=%~2"&set "S=!S:\= !"
- (for %%i in (!S!) do set /a n+=1&set "D!n!=%%i")&set "D1=!D1!\"&set /a n-=1
- (for /l %%i in (1 1 !n!) do (cd /d "!D%%i!"&set /a n=%%i+1
- for %%j in (!n!) do (set "t=!D%%j:~,-1!?"&for /d %%k in (!t!) do (
- if "%%~snxk"=="!D%%j!" set "L=!L!\%%~k"))))&if not exist "%~2\" (for %%i in (!n!) do (
- set "t=!D%%i:~,-1!?"&for /r %%j in (!t!) do if "%%~snxj"=="!D%%i!" set "L=!L!\%%~nxj"))
- 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 编辑
我来个递归方案:- @echo off
- set "strShortPath=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
- if not exist "%strShortPath%" echo NULL&pause & exit
-
- call :getFullPath "%strShortPath%"
- for %%i in ("%strFullPath%.") do set "strFullPath=%%~fi"
- echo %strfullPath%
- pause & exit
-
- :getFullPath
- for %%i in ("%~1\..") do (
- cd /d "%%~fi"
- for /f "delims=" %%j in ('dir /a /b "%~1?"') do (
- if /i "%%~snxj"=="%~nx1" (
- set "strFullPath=%%j\%strFullPath%"
- if /i not "%%~fi"=="%~d1\" call :getFullPath "%%~fi"
- )
- )
- )
复制代码
作者: 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+*来获取文件路径,不过代码比较多需要简化一下- @echo off
- setlocal enabledelayedexpansion
- set "Temp1=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
- set Temp1=%Temp1:\= %
- for %%a in (%Temp1%) do (
- set name=%%a
- set name1=!name:~-2,1!
- set name2=!name:~0,1!
- cd /d "!flies!"
- if "!name1!"=="~" (
- for /f "delims=" %%i in ('dir /b/a "!flies!!name2!*"') do (
- if "%%~sfi"=="!flies1!!name!" (
- set "flies=%%~fi\"
- set "flies1=%%~sfi\"
- )
- )
- ) else (
- set "flies=!flies!!name!\"
- set "flies1=!flies1!!name!\"
- )
- )
- if not exist "!flies!" set flies=!flies:~0,-1!
- echo.!flies!
- pause
复制代码
作者: ttszuo 时间: 2015-8-13 10:11
回复 5# CrLf
.....我的也是xp系统,还是短路径输出
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |