在批处理文件中,如在标准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运行
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/zh-cn/windows-server/administration/windows-commands/call
realpath
实现可靠的路径归一化。