【问题标题】:Batch file to go one step back [duplicate]批处理文件后退一步[重复]
【发布时间】:2017-09-22 07:43:53
【问题描述】:

我正在编写一个批处理文件,我想将一些文件从根路径移动到 cd .. 根目录。

我使用 %~dp0 来查找根路径。

从根路径后退一步的最佳方法是什么?

非常感谢

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    %~dp0 指向当前批处理文件的父目录(包括结尾的\),%~dp0.. 因此指向批处理文件的祖父目录。

    您可以使用for loop 及其变量引用的~f modifier (%%I) 来解析路径:

    for %%I in ("%~dp0..") do echo/%%~fI
    

    【讨论】:

    • 除了错字,你的回答给我留下了更多的问题。 %~dp0. 是否指向父目录,%~dp0... 是否指向曾祖父母等。如果%~dp0 扩展为驱动器号和路径,为什么我需要使用~f 修饰符。 "%~dp0.." 是否在括号评估期间未展开,因此将完全展开的驱动器和路径作为变量 "%%I" 传递给字符串。为什么需要使用~f 进行另一个扩展?
    • @Compo,为什么%~dp0.. 会自动解析? %~dp0 简单地扩展为驱动器 (d) 和路径 (p) 到当前批处理文件的父目录,并以 \ 结尾,无论您是预先添加还是附加 .. 之类的内容。一个.指向同一个目录(所以anydir\middir\subdiranydir\middir\subdir\.一样),..指向父目录(所以anydir\middir\subdir\..anydir一样);没有...(你需要做anydir\middir\subdir\..\..指向anydir)...
    • @Compo,你所说的“括号评估”是什么意思?你的意思是,for 自动解析in 之后的部分?不,不是的;它永远不会解析像anydir\middir\subdir\..\.\..\file.ext 这样的路径,它只解析通配符(*?),当它们出现在最后一个路径元素中时(所以在最后一个\ 后面);您需要使用 ~f 修饰符来解析路径;注意for不会访问文件系统来检查路径是否真实存在,除非包含通配符...
    【解决方案2】:

    你快到了,只需使用%~dp0..

    或者如果你想完全解决,使用这个技巧

    @echo off
    call :resolve "%~dp0.."
    goto :eof
    
    :resolve
    echo %~f1
    goto :eof
    

    有关解释,请参阅此 SO 答案https://stackoverflow.com/a/15568171/30447

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      相关资源
      最近更新 更多