也谈批处理(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 方法,以参数的强大功能,获取当前目录名。不过,同样会有反斜杠的问题
- 作者:梦想种子
- @echo off
- call :get "%cd%"
- pause>nul
- exit
- :get
- echo %~nx1
二、利用Loop,循环获取内容,从第一个反斜杠遍历到最后一个
- 作者:随风
- @echo off
- call :loop "c:\1334 \459sdf fdh8\40958345\aaa.bbb.ccc"
- echo %a%
- pause&exit
- :loop
- for /f "tokens=1* delims=\" %%a in ("%~1") do (
- set a=%%a
- if not "%%b"=="" call :loop "%%b"
- )
- goto :eof
三、利用For,和我之前的做法一样,同样不能处理最后有反斜杠的情况
- 作者:foxJL
- @echo off
- for %%i in ("%cd%") do echo %%~ni
- pause
最后是我最后想到的一个投机取巧的方法:
一、你可以使用 pushd,将你要取的目录设为当前目录。因为当前目录是不包含反斜杠的,所以问题不存在,用上述第三种方法即可。
但是,存在一个问题,批处理无法将远程地址,比如局域网地址,设置为当前目录。
二、给要设置的目录加上一些东西,让for获取的时候,产生一种自动去除反斜杠的功效:
for /f "tokens=*" %%i in ("%PackDir%\tmp\..") do set "PackType=%%~ni"
已测试,无论后面是否带有反斜杠,都不会有问题。。。
总结,当然,我这么做只是为了只用一行就解决这个问题,如果使用多行的话解决方法就多了去了。在最后再说上一个多行的方法:去掉最后一个反斜杠。因为 %~dp1 这样的形式默认是会带上反斜杠的,所以,我们可以这样做,去掉反斜杠: set "path=%path:~0,-1%"。也就是去掉了最后一个字符,但这里,我们已经保证过后面一定是一个反斜杠,所以,也就代表了去除最后一个反斜杠的目的。完整书写如下:
- set "path=%~dp1"
- set "path=%path:~0,-1%"
- for %%i in ("%path%") do echo %%~ni
好了,这个就是我所有的解决方案了,希望对同样遇到此类问题的朋友有些帮助。
- 上一篇: 已是第一篇
- 下一篇:瞬间化繁为简的批处理技巧的初级应用一>>