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