您正在使用 Internet Explorer 6,在本页面的显示效果可能有差异。建议您升级到 Internet Explorer 8 或以下浏览器: Firefox / Chrome / Safari / Opera
首 页 文章批处理 也谈批处理(CMD)获取目录名

也谈批处理(CMD)获取目录名

       昨天对 WLDNA Pack Center的批处理打包部分进行整理,以改善对特殊字符的支持的时候。遇到了这个问题:批处理如何获取当前目录

       这个是一个自动压缩的脚本,而且为了方便批处理获取压缩的文件夹类型,故我把文件夹名设定为了文件类型:X:\XX\rar\X:\XX\zip\。所以这里我要获取这个rar或者zip。我之前用的脚本是这样的:for /f "tokens=*" %%i in ("%PackDir%") do set "PackType=%%~ni" 。但是这个做法有一个bug:当最后带有 反斜杠(\)的时候,就无法获取到正确的目录名。

       因为有这个bug,我就去网上搜索了下,企图找到更合适的 做法。多番谷歌之下,我找到了这篇文章:批处理获取当前目录名 。这篇文章很多高手写出了很多的方法,让我获益良多,但是我有不甘心用Label,或者loop方式。因为个人比较懒,写多行东西总是看起来比较麻烦。所以,晚上花了几个小时去尝试,有什么方法可以做到一行就提取目录名,而且无视最后的反斜杠(\)

      这里先贴出,我个人觉得不错的几个方法给大家做对比:

一、利用Label 和 Call 方法,以参数的强大功能,获取当前目录名。不过,同样会有反斜杠的问题

  1. 作者:梦想种子
  2. @echo off
  3. call :get "%cd%"
  4. pause>nul
  5. exit
  6. :get
  7. echo %~nx1

二、利用Loop,循环获取内容,从第一个反斜杠遍历到最后一个

  1. 作者:随风
  2. @echo off
  3. call :loop "c:\1334 \459sdf fdh8\40958345\aaa.bbb.ccc"
  4. echo %a%
  5. pause&exit
  6. :loop
  7. for /f "tokens=1* delims=\" %%a in ("%~1") do (
  8.   set a=%%a
  9.   if not "%%b"=="" call :loop "%%b"
  10. )
  11. goto :eof

三、利用For,和我之前的做法一样,同样不能处理最后有反斜杠的情况

  1. 作者:foxJL
  2. @echo off
  3. for %%i in ("%cd%") do echo %%~ni
  4. pause

    最后是我最后想到的一个投机取巧的方法:

    一、你可以使用 pushd,将你要取的目录设为当前目录。因为当前目录是不包含反斜杠的,所以问题不存在,用上述第三种方法即可。

           但是,存在一个问题,批处理无法将远程地址,比如局域网地址,设置为当前目录。

   二、给要设置的目录加上一些东西,让for获取的时候,产生一种自动去除反斜杠的功效:

           for /f "tokens=*" %%i in ("%PackDir%\tmp\..") do set "PackType=%%~ni"
          已测试,无论后面是否带有反斜杠,都不会有问题。。。


    总结,当然,我这么做只是为了只用一行就解决这个问题,如果使用多行的话解决方法就多了去了。在最后再说上一个多行的方法:去掉最后一个反斜杠。因为 %~dp1 这样的形式默认是会带上反斜杠的,所以,我们可以这样做,去掉反斜杠: set "path=%path:~0,-1%"。也就是去掉了最后一个字符,但这里,我们已经保证过后面一定是一个反斜杠,所以,也就代表了去除最后一个反斜杠的目的。完整书写如下:

  1. set "path=%~dp1"
  2. set "path=%path:~0,-1%"
  3. for %%i in ("%path%") do echo %%~ni

    好了,这个就是我所有的解决方案了,希望对同样遇到此类问题的朋友有些帮助。

返回顶部】 【打印此页】 【关闭