小编典典

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

all

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

鉴于:

"..\"
"..\somefile.txt"

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

例子:

  • “somefile.txt”位于“C:\Foo\”
  • “test.bat”位于“C:\Foo\Bar”。
  • 用户在“C:\Foo”中打开一个命令窗口并调用Bar\test.bat ..\somefile.txt
  • 在批处理文件中“C:\Foo\somefile.txt”将来自%1

阅读 71

收藏
2022-08-19

共1个答案

小编典典

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

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

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

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

今天早上我遇到了类似的需求:如何在 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 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 运行它

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

…您将观察到以下输出:

%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"

可以在此处找到批处理参数上允许的一组修饰符的文档: https ://docs.microsoft.com/en-us/windows-
server/administration/windows-commands/call

2022-08-19