2024-04-27 14:49:34 发布
网友
我想从.bat文件中获取文件的父目录。所以,给定一个变量设置为"C:\MyDir\MyFile.txt",我想得到"C:\MyDir"。换句话说,相当于典型UNIX环境中的dirname()功能。这可能吗?
.bat
"C:\MyDir\MyFile.txt"
"C:\MyDir"
dirname()
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%中的文件名的驱动器和目录。
%dirname%
%filename%
不过,要小心文件名中包含空格。要么必须用引号括起来:
set filename="C:\MyDir\MyFile with space.txt"
或者必须在for循环中的参数周围加引号:
for
for %%F in ("%filename%") do set dirname=%%~dpF
两种方法都可以,但两种方法都不行:-)
for循环的问题是它在字符串的末尾留下了尾随的“/”。如果要多次获取dirname,这将导致问题。也许您需要获取目录的名称,该目录是包含该文件的目录的祖父母,而不仅仅是父目录。第二次简单地使用for循环技术将删除\,并且不会得到祖父母目录。
那就是你不能简单地做以下事情。
这将把dirname设置为“c:\1\2\3”,而不是“c:\1\2”。
下面的函数通过移除尾随的\来解决这个问题。
它被称为如下。
如果由于任何原因您不能使用(没有命令扩展等),您可能能够逃脱..\hack:
这将把
%dirname%
设置为存储在%filename%
中的文件名的驱动器和目录。不过,要小心文件名中包含空格。要么必须用引号括起来:
或者必须在
for
循环中的参数周围加引号:两种方法都可以,但两种方法都不行:-)
相关问题 更多 >
编程相关推荐