[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理怎样根据已知的文件短路径获取完整的长路径?

本帖最后由 pcl_test 于 2016-8-11 23:50 编辑

求这样的批处理:传递给他一个短文件名,返回对应的长文件名。
即:
call 长文件名.bat C:\PROGRA~1\COMMON~1\MICROS~1\DAO\dao360.dll
返回正确的长文件名:
"C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"

环境:windows XP
要求:尽量不使用第三方软件,只使用xp自带的程序。

我的实现方法:
@echo off
if "%1"=="" goto callmyself
set longpath=%~d1
set s=%~dpfxs1
set s=%s:\= %
call :getfullname %s%
echo "%longpath%"
goto :eof

:callmyself
call %0 C:\PROGRA~1\COMMON~1\MICROS~1\DAO\dao360.dll
goto :eof

:getfullname
if "%2"=="" goto :eof
if not "%3"=="" (
   
for /f "tokens=*" %%i in ('dir /ad /b "%longpath%\%2*"') do set longpath=%longpath%\%%i
   
shift
    goto
getfullname
) else (
   
for /f "tokens=*" %%i in ('dir /b "%longpath%\%2*"') do set longpath=%longpath%\%%i
   
goto :eof
)


[ 本帖最后由 dishuo 于 2008-8-18 19:50 编辑 ]

  1. @echo off&setlocal enabledelayedexpansion
  2. set "acc=C:\PROGRA~1\COMMON~1\MICROS~1\DAO\dao360.dll"
  3. for /f "delims=" %%a in ("%acc%") do set "access=%%~da\"&set "file=%%~nxa"s
  4. for %%i in ("%access%" "%file%") do set "acc=!acc:%%~i=!"
  5. set "acc=%acc:\= %"
  6. for %%a in (%acc%) do (
  7. set "ac=%%a"
  8. call :lp
  9. )
  10. echo %access%%file%
  11. pause>nul&exit/b
  12. :lp
  13. for /f "delims=" %%a in ('dir/b "%access%%ac:~,6%*"') do (
  14. set "access=!access!%%a\"
  15. )
复制代码
心绪平和,眼藏静谧。

TOP

受教了!
学习之后修改如下,目前测试没有发现问题.
@echo off&setlocal enabledelayedexpansion
cls
if
"%1"=="" goto callmyself
call :getfullname %1
echo "%filepath%"
echo "%filename%"
echo "%fileext%"
pause

:getfullname
::需要 setlocal enabledelayedexpansion
::使用 %filepath%\%filename%.%fileext%
set "p=%~s1"
set "filepath=%~d1"
set "filename=%~nxs1"
set "fileext=%~x1"
for %%i in (%filepath% %filename%) do set "p=!p:%%i=!"
set "p=%p:\= %"
for %%i in (%p%) do for /f "tokens=*" %%j in ('dir /ad /b "!filepath!\%%i*"') do set "filepath=!filepath!\%%j"
for /f "tokens=*" %%i in ('dir /b "%filepath%\%filename%*"') do set "filename=%%i"
set "filename=!filename:%~x1=!
set "fileext=%fileext:.=%"
exit /b

:callmyself
call %0 C:\PROGRA~1\COMMON~1\MICROS~1\DAO\dao360.dll

[ 本帖最后由 dishuo 于 2008-8-18 22:24 编辑 ]

TOP

2楼结果正确,运行结果如下:
C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll


3楼结果不正确,运行结果如下:

"C:\Program Files\Common Files\Microsoft Shared\DAO"
"dao360"
"dll"
请按任意键继续. . .

TOP

返回列表