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

Batch file 如何在批处理文件中获取部分目录路径,batch-file,Batch File,我在目录中有一个BAT文件 D:\dir1\dir2\getpath.bat 当我用下面的代码运行bat时,它会打印出来 D:\dir1\dir2\ 我只需要路径D:\dir1\ 目录结构不是固定的,需要完整的目录路径,而不是BAT文件所在的当前目录 @echo off SET SUBDIR=%~dp0 ECHO %SUBDIR% 尝试在for循环中使用delims,但没有帮助。如果它是脚本所在目录的父目录,请尝试以下操作: @echo off SET MYDIR=%cd% cd %MY

我在目录中有一个BAT文件

D:\dir1\dir2\getpath.bat
当我用下面的代码运行bat时,它会打印出来

D:\dir1\dir2\
我只需要路径
D:\dir1\

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

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

尝试在for循环中使用delims,但没有帮助。

如果它是脚本所在目录的父目录,请尝试以下操作:

@echo off
SET MYDIR=%cd%
cd %MYDIR%\..
SET MYPARENTDIR=%cd%
cd %MYDIR%
@echo off
SET batchdir=%~dp0
cd /D "%batchdir%.."
echo %CD%
cd "%batchdir%"
(未经测试,如有问题请评论)

请注意,如果批处理驻留在驱动器根目录中(如
F:\
);,这当然不会改变任何内容如果您想要一个特殊的输出,如果是这样的话,您应该在回音之前针对
%batchdir%
测试
%CD%


编辑:应用补丁,请参阅@RichardA的评论,您几乎做对了。使用%dp0将获取到.bat的驱动器+完整路径,因此它也将返回bat文件所在的文件夹

由于active Direct将是运行bat的目录,因此您只需执行以下操作:

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

如果将其放入bat脚本中进行验证,请在换行符上插入一个
暂停
,以查看您的输出。

一行代码即可:-)

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

:parentfolder
echo %~dp1
goto :eof
如果您想要后面的反斜杠,那么

for %%A in ("%~dp0.") do @echo %%~dpA
for %%A in ("%~dp0..") do @echo %%~fA

如果您不想要后面的反斜杠,那么

for %%A in ("%~dp0.") do @echo %%~dpA
for %%A in ("%~dp0..") do @echo %%~fA

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

FOR %%V IN ("%~dp0..\..\") DO @ECHO %%~dpV
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\


我想我还没有完全理解。你到底想干什么?什么指定了您的“完整目录路径”?假设您将脚本移动到
F:\other\bin\own
,您的输出应该是什么
F:\other\bin\
F:\other\
或完全其他的东西?@SvenS:我希望输出为F:\other\bin如果
%~dp0=C:\dir1\dir2
设置
%SUBDIR:~0,-1%
将其转换为
C:\dir1\dir
。如果OP在一个编号的序列中没有同名的目录,这并不能解决他的问题。@Mechaflash:你在这方面试过了吗?你说的不是最后一步。值“C:\dir1\dir”被传递给另一个不进行回显的例程。如果你试着跑步,它会很好的工作。我喜欢这个答案。最好用setlocal/endlocal括起代码,这样在批处理文件上下文之外就不能使用SUBDIR了。@RichardA谢谢Richard。编辑为包含本地化。@阿伦,我希望你不要认为我太挑剔了。哦,endlocal太低了一行,应该在
goto:eof
之前。为什么active directory是运行bat的目录?如果他将其称为active directory是c:\并且运行D:\dir1\dir2\getpath.bat会怎么样?当从不同的目录或不同的驱动器上运行时,是否可以直接使用c:\?pushd/popd会比保存batchdir更简单吗?哦,你说得对,我会在补丁中编辑
%~dp0
不是工作目录,而是批处理所在的目录(),因此需要先将cd放入该目录(如果需要的话)。我真的不能对pushd/popd说什么。到底为什么会有人投反对票?它给出了正确的答案,并且从代码量和性能的角度来看都非常有效。