Adrien Pliss..
155
在批处理文件中,与标准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"
您可以同样处理`%0`和`%1`:`%〜dpnx0`用于完全限定的路径+批处理文件本身的名称,`%~dpnx1`用于完全限定的路径+其第一个参数的名称[如果这是文件名在所有].(但是,如果你不打算在命令行上提供完整的路径信息,你怎么能在不同的驱动器上命名文件?) (4认同)
这在NTFS符号链接上失败. (3认同)