【发布时间】:2017-09-22 07:43:53
【问题描述】:
我正在编写一个批处理文件,我想将一些文件从根路径移动到 cd .. 根目录。
我使用 %~dp0 来查找根路径。
从根路径后退一步的最佳方法是什么?
非常感谢
【问题讨论】:
标签: batch-file cmd
我正在编写一个批处理文件,我想将一些文件从根路径移动到 cd .. 根目录。
我使用 %~dp0 来查找根路径。
从根路径后退一步的最佳方法是什么?
非常感谢
【问题讨论】:
标签: batch-file cmd
%~dp0 指向当前批处理文件的父目录(包括结尾的\),%~dp0.. 因此指向批处理文件的祖父目录。
您可以使用for loop 及其变量引用的~f modifier (%%I) 来解析路径:
for %%I in ("%~dp0..") do echo/%%~fI
【讨论】:
%~dp0. 是否指向父目录,%~dp0... 是否指向曾祖父母等。如果%~dp0 扩展为驱动器号和路径,为什么我需要使用~f 修饰符。 "%~dp0.." 是否在括号评估期间未展开,因此将完全展开的驱动器和路径作为变量 "%%I" 传递给字符串。为什么需要使用~f 进行另一个扩展?
%~dp0.. 会自动解析? %~dp0 简单地扩展为驱动器 (d) 和路径 (p) 到当前批处理文件的父目录,并以 \ 结尾,无论您是预先添加还是附加 .. 之类的内容。一个.指向同一个目录(所以anydir\middir\subdir和anydir\middir\subdir\.一样),..指向父目录(所以anydir\middir\subdir\..和anydir一样);没有...(你需要做anydir\middir\subdir\..\..指向anydir)...
for 自动解析in 之后的部分?不,不是的;它永远不会解析像anydir\middir\subdir\..\.\..\file.ext 这样的路径,它只解析通配符(*,?),当它们出现在最后一个路径元素中时(所以在最后一个\ 后面);您需要使用 ~f 修饰符来解析路径;注意for不会访问文件系统来检查路径是否真实存在,除非包含通配符...
你快到了,只需使用%~dp0..
或者如果你想完全解决,使用这个技巧
@echo off
call :resolve "%~dp0.."
goto :eof
:resolve
echo %~f1
goto :eof
有关解释,请参阅此 SO 答案https://stackoverflow.com/a/15568171/30447
【讨论】: