从相对路径和/或文件名解析绝对路径

在Windows批处理脚本中是否有方法从包含文件名和/或相对路径的值返回绝对路径?

鉴于:

".."
"..somefile.txt"

我需要相对于批处理文件的绝对路径。

例:

  • “somefile.txt”位于“C: Foo ”中
  • “test.bat”位于“C: Foo Bar”中。
  • 用户在“C: Foo”中打开命令窗口并调用Bartest.bat ..somefile.txt
  • 在批处理文件“C: Foo somefile.txt”将从%1派生

  • 在批处理文件中,与标准C程序中一样,参数0包含当前正在执行的脚本的路径。 您可以使用%~dp0来仅获取第0个参数(它是当前脚本)的路径部分 - 此路径始终是完全限定的路径。

    您也可以通过使用%~f1来获取第一个参数的完全限定路径,但是这会根据当前工作目录给出一个路径,这显然不是您想要的。

    就我个人而言,我经常在我的批处理文件中使用%~dp0%~1习语,它解释了相对于执行批处理路径的第一个参数。 但它确实有一个缺点:如果第一个参数完全合格,它就会失败。

    如果您需要支持相对路径和绝对路径,则可以使用FrédéricMénez的解决方案:临时更改当前工作目录。

    下面是一个将演示这些技术的示例:

    @echo off
    echo %%~dp0 is "%~dp0"
    echo %%0 is "%0"
    echo %%~dpnx0 is "%~dpnx0"
    echo %%~f1 is "%~f1"
    echo %%~dp0%%~1 is "%~dp0%~1"
    
    rem Temporarily change the current working directory, to retrieve a full path 
    rem   to the first parameter
    pushd .
    cd %~dp0
    echo batch-relative %%~f1 is "%~f1"
    popd
    

    如果将其保存为c: temp example.bat并从c: Users Public as运行它

    c: Users Public> temp example.bat .. windows

    ...你会观察下面的输出:

    %~dp0 is "C:temp"
    %0 is "tempexample.bat"
    %~dpnx0 is "C:tempexample.bat"
    %~f1 is "C:Userswindows"
    %~dp0%~1 is "C:temp..windows"
    batch-relative %~f1 is "C:Windows"
    

    今天早上我遇到了类似的需求:如何在Windows命令脚本中将相对路径转换为绝对路径。

    下面的诀窍是:

    @echo off
    
    set REL_PATH=....
    set ABS_PATH=
    
    rem // Save current directory and change to target directory
    pushd %REL_PATH%
    
    rem // Save value of CD variable (current directory)
    set ABS_PATH=%CD%
    
    rem // Restore original directory
    popd
    
    echo Relative path: %REL_PATH%
    echo Maps to path: %ABS_PATH%
    

    大多数这些答案看起来比复杂和超级越野车疯狂,这是我的 - 它适用于任何环境变量,没有%CD%PUSHD / POPD ,或者for /f废话 - 只是普通的旧批处理函数。 - 目录&文件甚至不必存在。

    CALL :NORMALIZEPATH "......foobar.txt"
    SET BLAH=%RETVAL%
    
    ECHO "%BLAH%"
    
    :: ========== FUNCTIONS ==========
    EXIT /B
    
    :NORMALIZEPATH
      SET RETVAL=%~dpfn1
      EXIT /B
    
    链接地址: http://www.djcxy.com/p/59559.html

    上一篇: Resolve absolute path from relative path and/or file name

    下一篇: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?