ara*_*orn 23 windows command-line batch-file
我想从.bat文件中获取文件的父目录.所以,给定一个变量"C:\MyDir\MyFile.txt",我想得到"C:\MyDir".换句话说,相当于dirname()典型UNIX环境中的功能.这可能吗?
Joe*_*oey 25
for %%F in (%filename%) do set dirname=%%~dpF
Run Code Online (Sandbox Code Playgroud)
这将设置%dirname%为存储在其中的文件名的驱动器和目录%filename%.
但是要注意包含空格的文件名.要么必须设置周围的引号:
set filename="C:\MyDir\MyFile with space.txt"
Run Code Online (Sandbox Code Playgroud)
或者你必须在for循环中的参数周围加上引号:
for %%F in ("%filename%") do set dirname=%%~dpF
Run Code Online (Sandbox Code Playgroud)
任何一种方法都可以,两者同时不会:-)
如果由于某种原因你不能使用FOR(没有命令扩展等)你可能能够逃脱..\hack:
set file=c:\dir\file.txt
set dir=%file%\..\
Run Code Online (Sandbox Code Playgroud)
for 循环的问题在于它在字符串末尾留下了尾随的 \。如果您想多次获取目录名,这会导致问题。也许您需要获取包含该文件的目录的祖父目录的名称,而不仅仅是父目录。再次使用 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
Run Code Online (Sandbox Code Playgroud)
这会将目录名设置为“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
Run Code Online (Sandbox Code Playgroud)
其调用方式如下。
set filename=c:\1\2\3\t.txt
call :dirname "%filename%" _dirname
call :dirname "%_dirname%" _dirname
Run Code Online (Sandbox Code Playgroud)