我想从.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