我想知道如何获取批处理文件的当前目录和批处理文件的父目录。 通过例子很容易解释。 让我们假设我的批处理文件位置 D:\Ashish\Gupta bc\xyz.bat 如何从 xyz.bat 获取以下位置
我尝试在互联网上搜索并得到几个答案,但仍然很困惑。
您可以将
PUSHD ..
与 for /L loop
和 If
条件语句一起使用,直到到达根目录,如下所示:
@Echo off & CD "%~dp0"
Set "Path[0]=%~dp0"
Setlocal EnableDelayedExpansion
PUSHD ..
For /L %%i in (1 1 20)Do (
If /I not "!CD!" == "!LastDir!" (
Set "Path[%%i]=!CD!"
Set "Root{i}=%%i"
Set "LastDir=!Path[%%i]!"
PUSHD ..
)
)
Set Path[
Set Root{
For /L %%i in (0 1 %Root{i}%) Do POPD
ECHO %CD%
Endlocal
上面创建了一个父文件夹的零索引数组,一直到根驱动器。 for /L 循环迭代中使用的 20 值是一个相当任意的数字 - 我看不到很多情况下您将嵌套那么多子文件夹,但是如果由于某种原因您有深层嵌套的子文件夹,您可能需要增加迭代次数。
实现起来非常简单:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FilePath=%~dp0"
:ParsePath
for %%I in ("%FilePath%.") do (
echo %%~fI
set "FilePath=%%~dpI"
if not "%%~dI\" == "%%~dpI" if not "%%~dpI" == "%%~fI" goto ParsePath
if not "%%~dpI" == "%FilePath%" echo %%~dI\
)
endlocal
pause
批处理文件首先使用前两个命令行定义执行环境。
然后它将始终以反斜杠结尾的批处理文件的完整路径分配给环境变量
FilePath
。
命令
for
用于获取环境变量FilePath
(驱动器和路径)中左到最后一个反斜杠的字符串以及环境变量FilePath
(当前文件夹名称)中最后一个反斜杠右的字符串。
.
附加到分配给 FilePath
的字符串中,以强制命令 for
访问文件系统以获取当前文件路径,末尾不带反斜杠。点表示当前目录。因此,在 for
循环的第一次迭代中,D:\Ashish\Gupta\abc\
扩展为 D:\Ashish\Gupta\abc\.
,因此 %%~fI
扩展为 D:\Ashish\Gupta\abc
,而 %%~dpI
扩展为 D:\Ashish\Gupta\
以进行下一次循环运行。
如果只使用 %%~fI
而不使用
%%~dpI
,则
D:\Ashish\Gupta\abc\
和 "%FilePath%"
将在第一次循环运行时扩展为 .
,因为在这种情况下,文件/文件夹字符串已经定义了一个不再包含任何内容的绝对路径相对部分,因此 for
不会访问文件系统来确定完整的文件/文件夹名称和文件/文件夹的完整路径。
可以使用命令
for
来分割根本不存在的文件或文件夹的文件/文件夹字符串。有 if exist
用于检查文件/文件夹是否存在。命令for
不是设计用于文件/文件夹存在检查。在很多用例中,for
用于将完整限定文件名拆分为文件路径和文件名+扩展名,而文件尚未存在。
从
FilePath
中删除一个接一个的目录名称,直到仅留下驱动器号 + 冒号 + 反斜杠,如 C:\
或 \\ComputerName\
(如果批处理文件存储在使用 UNC 路径访问的网络资源上)。
驱动器根目录上的条件
if not "%%~dI\" == "%%~dpI"
为 not 为剩余文件路径。
条件
if not "%%~dpI" == "%%~fI"
是 \\ComputerName\
上的 nottrue,是剩余的文件路径。
因此,如果这两个条件之一不再为真,则到达顶层,因此不再执行
goto ParsePath
来再次解析剩余的文件路径。如果未使用 UNC 路径调用批处理文件并且批处理文件未存储在驱动器的根目录中,则会输出驱动器的根目录路径。
批处理文件在运行时输出
D:\Ashish\Gupta\abc\ParsePath.bat
:
D:\Ashish\Gupta\abc
D:\Ashish\Gupta
D:\Ashish
D:\
批处理文件在运行时输出
D:\ParsePath.bat
:
D:\
批处理文件在运行时输出
\\GuptaMachine\D$\Ashish\Gupta\abc\ParsePath.bat
:
\\GuptaMachine\D$\Ashish\Gupta\abc
\\GuptaMachine\D$\Ashish\Gupta
\\GuptaMachine\D$\Ashish\
\\GuptaMachine\D$
\\GuptaMachine\
另请参阅批处理文件中以下命令行的输出:
for %%I in ("%~dp0.") do (
echo Batch file folder name: %%~nxI
echo Batch file folder path: %%~fI
)
我建议您还阅读有关 命名文件、路径和命名空间 的 Microsoft 文档,因为也可以使用
..
或 ..\..
与 %~dp0
来获取父文件夹之一的文件夹路径确保存在父文件夹,因为批处理文件永远不会存储在驱动器的根文件夹中。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...解释如何引用批处理文件参数,例如参数 0(批处理文件本身)。echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?