如何获取Windows批处理文件的父文件夹

22
我正在编写一个批处理文件,需要获取此bat文件的父文件夹。这是可能的吗?注意,我指的是批处理文件的父文件夹,而不是调用该批处理文件的提示符当前目录的父文件夹。
谢谢
4个回答

47

批处理文件的父文件夹在变量%~dp0中。例如:

@echo off&setlocal
for %%i in ("%~dp0.") do set "folder=%%~fi"
echo %folder%

2
可能是我忘了说它是Windows批处理文件,所以无法正常工作。 - Tobia
2
是的,我知道。我的答案是纯批处理。将其放在记事本中的文本文件中,命名为例如 mybatch.bat,并从命令行启动它。如果您从资源管理器启动它,请在末尾加上 pause - Endoro
无法从命令行执行test.bat。它位于文件夹c:\test123\test.bat中,代码与上面完全一样。当我运行它时,输出为c:\ - Northstrider
4
好的,没问题。c:\test123\test.bat 的文件夹是 test123,在你的情况下父文件夹是 "c:"。 - Endoro
4
你需要删除("~dp0..")中的两个点,因为它们会让目录向上多一层。问题是如何找到批处理文件的父文件夹,而不是父文件夹的父文件夹... - Dominik

8
如果您想要批处理文件所在的文件夹,可以像另一个答案中提到的那样使用以下命令:

SET folder=%~dp0

如果您想要批处理文件所在文件夹的上层文件夹,则可以使用以下命令:

SET folder=%~dp0..\

但是,如果您打算将此路径显示给用户,则可能会发现上述变量不足够。 在这种情况下,可以使用以下命令:

FOR %%A IN ("%~dp0.") DO SET folder=%%~dpA

例如,如果您在 C:\Users\Public 目录下有以下脚本:

@ECHO OFF
ECHO %~dp0
ECHO %~dp0..\
FOR %%A IN ("%~dp0.") DO ECHO %%~dpA

输出将是:
C:\Users\Public\
C:\Users\Public\..\
C:\Users\

6

Endoro的回答对我也不起作用,但是这个可以。这就是我自己用来做这个的。

V3

其中一个应该会做正确的事情

for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set ParentFolderName=%%~nxJ
echo %ParentFolderName%

for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set ParentFolderName=%%~dpnxJ
echo %ParentFolderName%

V2:

for %%I in ("%~dp0\.") do set ParentFolderName=%%~nxI
echo %ParentFolderName%

V1:

这个函数获取当前工作目录的父目录。

for %%I in (..) do set ParentFolderName=%%~nI%%~xI
echo %ParentFolderName%

参考:适用于 | Microsoft Docs


2
这是当前工作文件夹的父文件夹,而不是批处理文件的父文件夹(它们可以相同,但不能保证)。 (顺便说一句:%%〜nI%%〜xI 可以缩短为 %%〜nxI - Stephan
但现在它几乎是原始答案,唯一的区别是您只获取文件夹名称而没有任何前置信息。对于 C:\Projects\User1\batchFiles\myFile.bat,您的解决方案仅提取 batchFiles - jeb
(显然有些混淆“父文件夹”的概念 - 就我理解,“batchfiles”是“批处理文件夹”,其父文件夹是“User1”,但OP似乎有不同的定义) - Stephan
@Stephan 收到。在这里再试一次。 - cpcolella
1
这个方法即使路径中的一个文件夹名称有空格也能正常工作。我发现其他一些解决方案在这方面都失败了。天啊,我真的很讨厌Windows。 - Jeff Holt
显示剩余2条评论

0

所以这是一个糟糕的答案,但是现在我用它的次数比我愿意承认的要多:

powershell -command "(get-item '%~dp0').name" > %temp%\temp_var.txt
set /p parent_folder= < %temp%\temp_var.txt
echo %parent_folder%
pause

由于 PowerShell 在 Windows 中几乎无处不在,因此我尽可能地滥用它。

然而,这是不好的,因为它依赖于 PowerShell 存在于您的环境路径中,并且依赖于没有其他脚本在您的脚本写入和读取之间修改您的临时存储文件。


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