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

2024-04-27 14:49:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件功能目录txt环境unixmyfile典型
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

如果由于任何原因您不能使用(没有命令扩展等),您可能能够逃脱..\hack:

set file=c:\dir\file.txt
set dir=%file%\..\
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

两种方法都可以,但两种方法都不行:-)

相关问题 更多 >