如何在批处理文件中获得等效的dirname()?

时间:2009-04-22 16:36:37

标签: windows command-line batch-file

我想从.bat文件中获取文件的父目录。因此,如果变量设置为"C:\MyDir\MyFile.txt",我想获得"C:\MyDir"。换句话说,相当于典型UNIX环境中的dirname()功能。这可能吗?

3 个答案:

答案 0 :(得分:24)

for %%F in (%filename%) do set dirname=%%~dpF

这会将%dirname%设置为%filename%中存储的文件名的驱动器和目录。

注意包含空格的文件名。要么必须设置周围的引号:

set filename="C:\MyDir\MyFile with space.txt"

或者你必须在for循环中的参数周围加上引号:

for %%F in ("%filename%") do set dirname=%%~dpF

任何一种方法都可以,两者同时不会: - )

答案 1 :(得分:6)

如果由于某种原因你不能使用FOR(没有命令扩展等),你可能可以逃脱.. \ hack:

set file=c:\dir\file.txt
set dir=%file%\..\

答案 2 :(得分:3)

for循环的问题在于它在字符串的末尾留下尾随\。如果您想多次获取dirname,这会导致问题。也许您需要获取目录的名称,该目录是包含该文件的目录的祖父,而不仅仅是父目录。只需使用for循环技术,第二次将删除\,并且不会获取祖父目录。

那就是你不能简单地做到以下几点。

set filename=c:\1\2\3\t.txt
for %%F in ("%filename%") do set dirname=%%~dpF
for %%F in ("%dirname%") do set dirname=%%~dpF

这会将dirname设置为" c:\ 1 \ 2 \ 3",而不是" c:\ 1 \ 2"。

以下函数通过删除尾随\。

来解决该问题
:dirname file varName
    setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    SET _dir=%~dp1
    SET _dir=%_dir:~0,-1%
    endlocal & set %2=%_dir%
GOTO :EOF

如下所示。

set filename=c:\1\2\3\t.txt
call :dirname "%filename%" _dirname
call :dirname "%_dirname%" _dirname