如何在batch file中获得相同的dirname()?

我想从.bat文件中获取文件的父目录。 所以,给定一个variables设置为"C:\MyDir\MyFile.txt" ,我想获得"C:\MyDir" 。 换句话说,在典型的UNIX环境中,相当于dirname()function。 这可能吗?

 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 

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

如果因为什么原因你不能使用FOR(没有命令扩展等),你可能会逃脱.. \ hack:

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

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