批处理文件返回一步
Batch file to go one step back(批处理文件向后退一步)问题的出现的原因是不清楚如何在批处理文件中返回上一级目录,并且对一些批处理文件的语法和操作不理解。解决方法是使用特定的批处理语法和命令来解析路径,并正确使用相关修饰符。
在批处理文件中,%~dp0
表示当前批处理文件的父目录(包括一个尾部的 \
),因此 %~dp0..
表示批处理文件的父目录的父目录。可以使用 for
循环和变量引用的 ~f
修饰符(%%I
)来解析路径:
for %%I in ("%~dp0..") do echo/%%~fI
另外,除了打字错误外,回答中还有一些问题。例如,%~dp0.
是否指向父目录,%~dp0...
是否指向曾祖父目录等等。如果 %~dp0
展开为驱动器(d
)和路径(p
)到当前批处理文件的父目录,并带有尾部的 \
,那么为什么需要使用 ~f
修饰符呢?难道不是在括号评估期间展开 "%~dp0.."
,因此将完全展开的驱动器和路径传递给字符串作为变量 "%%I"
吗?为什么还需要使用 ~f
进行另一次展开呢?
此外,为什么 %~dp0..
会自动解析?%~dp0
只是展开为当前批处理文件的父目录的驱动器(d
)和路径(p
),无论你在前面还是后面添加什么,比如 ..
。一个 .
表示同一个目录(所以 anydir\middir\subdir
和 anydir\middir\subdir\.
是相同的),..
表示父目录(所以 anydir\middir\subdir\..
是相同的 anydir
);没有 ...
(如果要指向 anydir
,需要使用 anydir\middir\subdir\..\..
)...
最后,关于 "括号评估" 是什么意思?你是说 for
自动解析 in
后面的部分吗?不,它不会自动解析类似于 anydir\middir\subdir\..\.\..\file.ext
的路径,它只会在最后一个路径元素(最后一个 \
后面)出现通配符(*
,?
)时解析;你需要使用 ~f
修饰符才能解析路径;请注意,for
不会访问文件系统来检查路径是否真实存在,除非包含通配符...
在批处理文件中,有时需要返回上一级目录。下面的代码提供了两种方法来实现这一目的。
第一种方法是使用%~dp0..
。这将返回当前批处理文件所在目录的上一级目录。
第二种方法是通过以下代码来实现完全解析:
off call :resolve "%~dp0.." goto :eof :resolve echo %~f1 goto :eof
这段代码将调用一个名为resolve
的子程序,并将当前批处理文件所在目录的上一级目录作为参数传递给它。然后,resolve
子程序使用echo %~f1
来输出解析后的上一级目录的完整路径。
如果要了解更多详细信息,请参考这个Stack Overflow回答。