如何在批处理文件中获取目录路径的一部分

5

我在一个目录中有一个BAT文件

D:\dir1\dir2\getpath.bat

当我运行以下代码的批处理文件时,它会打印出:
D:\dir1\dir2\

我只需要路径 D:\dir1\

目录结构不是固定的,需要完整的目录路径而不是BAT文件所在的当前目录。

@echo off
SET SUBDIR=%~dp0
ECHO %SUBDIR% 

我尝试在for循环中使用分隔符,但并没有帮助。


我不认为我完全理解。你到底想做什么?你的“完整目录路径”是什么?假设你将脚本移动到F:\other\bins\own,你的输出应该是什么?F:\other\bins\F:\other\还是完全不同的其他内容? - SvenS
@SvenS:我想要输出为 F:\other\bins。 - Shaik Md
6个回答

3
@echo off
setlocal
SET SUBDIR=%~dp0
call :parentfolder %SUBDIR:~0,-1% 
endlocal
goto :eof

:parentfolder
echo %~dp1
goto :eof

如果%~dp0=C:\dir1\dir2,那么设置%SUBDIR:~0,-1%将把它变成C:\dir1\dir。但是,如果操作者在单个编号序列中没有具有相同名称的目录,则此方法无法解决他的问题。 - Anthony Miller
1
@Mechaflash:你在自己的端上试过这个吗?好吧,你所说的不是最后一步。值“C:\dir1\dir”被传递到另一个例程中进行ECHO。如果你尝试运行它,它会完美地工作。 - Arun
我喜欢这个答案。最好使用setlocal/endlocal将代码括起来,以便在批处理文件上下文之外无法访问SUBDIR。 - Richard A
@RichardA 谢谢 Richard。已编辑以包含本地化。 - Arun
@Arun,希望你不要觉得我太挑剔。哦,endlocal这一行放得有点低,应该在goto :eof之前。 - Richard A
@RichardA 没问题!我真的很感激你准确的输入。你再次是正确的,endlocal在一个永远不会被执行的地方!再次感谢你指出这个问题 - 特别是在大多数情况下这不会导致运行时错误。但你绝对是正确的,把它放在错误的位置可能会引发难以调试的麻烦。我已经纠正了它。真的非常感谢你! - Arun

1
一行代码就可以搞定 :-)
如果你想要尾部反斜杠,那么
for %%A in ("%~dp0.") do @echo %%~dpA

如果您不想要尾随的反斜杠,那么:
for %%A in ("%~dp0..") do @echo %%~fA

为什么会有人踩这个答案呢?它提供了正确的答案,而且非常高效,无论是从代码量还是性能方面来看。 - dbenham

1
@echo off
SET MYDIR=%cd%
cd %MYDIR%\..
SET MYPARENTDIR=%cd%
cd %MYDIR%

1
如果你想要的是你的脚本所在目录的父目录,那么可以尝试这个方法:
@echo off
SET batchdir=%~dp0
cd /D "%batchdir%.."
echo %CD%
cd "%batchdir%"

(未经测试,请在有问题的情况下进行评论)

请注意,如果您的批处理文件位于驱动器根目录中(例如F:\),这当然不会改变任何内容;) 如果您希望在这种情况下获得特殊输出,则应在回显之前将%CD%%batchdir%进行测试。

编辑:已应用补丁,请参见@RichardA的评论。


当从不同的目录或不同的驱动器运行时,这是否有效?使用pushd/popd比保存batchdir更简单吗? - Richard A
哦,你说得对,我会编辑一个补丁。%~dp0不是工作目录,而是批处理所在的目录(来源),因此您需要首先进入该目录(如果这是所需的)。我无法对pushd/popd做出任何评论。 - SvenS

0

%~dp0 返回当前批处理文件的完整驱动器号和路径。这可以在 FOR 命令中使用,以获取路径的部分:

当从 C:\dir1\dir2\dir3\batch.bat 运行时

FOR %%V IN ("%~dp0..\") DO @ECHO %%~dpV

返回 C:\dir1\dir2\

这可以扩展到继续向上的路径:

FOR %%V IN ("%~dp0..\..\") DO @ECHO %%~dpV

返回 C:\dir1\

来源:Microsoft有关批处理参数的信息


-1

你差不多做对了。使用%~dp0可以获取到你的.bat文件所在的驱动器和完整路径,因此它将返回包含你的bat文件的文件夹。

由于活动目录将是运行你的bat文件的目录,所以你只需要:

@echo off
CD ..
SET SUBDIR=%CD%
ECHO %SUBDIR%

如果将此内容放入批处理脚本中进行验证,请在新行上加入PAUSE以查看输出结果。

2
为什么活动目录会是批处理程序运行的目录?如果他将其称为活动目录是c:\并运行D:\dir1\dir2\getpath.bat,那么怎么办?活动目录不会是c:\吗? - Richard A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接