[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理IF Exist怎样判断带空格的目录是否存在?

本帖最后由 oenet 于 2011-7-10 13:11 编辑

判断一个空的目录是否存在时,经常使用 IF Exist xxx Echo Exist 之类的东西,但根据Microsoft解释,If Exist 不能测试目录,要测试目录需要加上\Nul,比如,要测试C:\xxx是否存在,使用IF Exist C:\xxx\Nul Echo Exist。

我的问题来了,现在有这样一个目录C:\AA BB,目录是带空格的,当然我会想到用"C:\AA BB"这样的形式,但是God,IF Exist "C:\AA BB"\Nul Echo Exist 或 IF Exist "C:\AA BB\Nul" Echo Exist 都不能做出正确判断。

Why? Can anyone tell me why? or teach me another way.

**********************************************************************************

补充一下:
IF Exist 是不能直接测试目录(文件夹)的,任何测试目录(文件夹)的方法都是间接的。常见的方法有:
1.测试目录(文件夹)下的NUL。
    这是最可靠的方法。
    任何目录(文件夹)下一定存在NUL,因此只要测试目录(文件夹)下是否存在NUL即可,如:IF Exist C:\mydir\Nul Echo OK!。但是这种方法也有个弊端,就是当目录(文件夹)名中存在空格时无法正常判断,当然也可以将目录名做一下处理,如使用短格式(感谢qzwqzw)。
    当然你可能会说,使用双引号将目录(文件夹)名括起来不就行了,非也,当我们使用双引号将目录(文件夹)名括起来的时候,这时目录(文件夹)名变成了什么?它变成了一个路径,要知道路径只是指向目标的一段字符串,在它下面是不可能存在NUL的,此时使用形如"C:\my dir\Nul"或"C:\my dir"\Nul的时候,你永远也得不到答案。

2.测试目录(方件夹)所在的路径。
    这是最直接有效的方法。
    只要存在一个路径一定存在它所指向的目录(文件夹),但是存在了目录(文件夹)却不一定存在它的路径(最简单的,隐藏分区下文件夹)。这就是这种方法的不可靠之处,但它却是最有效的,为什么呢?IF Exist 同样不能测试没有路径的目录(文件夹) ,所以当我们测试目录(文件夹)时,我们是知道它的路径的。
    这种方法就避免了上面提到的带空格的目录(文件夹)的弊端,不管目录中是否有空格,你都可以使用双引号将路径括起来。如:IF Exist "C:\mydir\" Echo OK! ,注意这里最后的\一定要加上,否则我们就不知道mydir是一个目录(文件夹)还是一个没有扩展名的文件了。

3.测试目录(文件夹)下的文件。
    如:IF Exist C:\mydir\*.* Echo OK! 不推荐这种方法,原因嘛,论坛里可以找到;P

以上写的IF Exist都是用于测试目录(文件夹)的,测试文件或其它IF Exist基本上都是直接的。
1

评分人数

    • zm900612: 感谢给帖子标题标注[已解决]字样PB + 2

为什么我这里可以直接 IF Exist C:\xxx\Nul Echo Exist
1

评分人数

TOP

这个是可以的,问题是目录带了空格,就不行了

TOP

Dir "C:\AA BB">Nul 2>Nul&&Echo Exist
1

评分人数

一路飘过的鸟~~~

TOP

:funk:

TOP

这个是可以的,问题是目录带了空格,就不行了
oenet 发表于 2011-7-7 17:28

打错了,是if exist C:\xxx echo Exist,貌似我这里可以直接判断

TOP

1# oenet
可以使用目录的短名形式
if exist c:\aabb~1\nul echo  OK!

另外4楼的方法有问题
无法区分存在的目录还是文件
改成下面这样就好了
dir /ad "c:\aa bb" >nul 2>nul && echo OK!
天的白色影子

TOP

7# qzwqzw

OK,很Thank you
我这里又有了个新问题,当目录名为A B的形式,就是两个单字母中间带空格,它的短格式怎么写?
AB~1是不对的,You know,AB0929~1正确了,可但是,这个0929怎么来的?
例如:“S B” 文件夹 ,Dir 短格式一下是这样的SB09B9~1,后面的09B9从何而来?

TOP

这个09B9是长文件名的Hash(哈希)值
在同一目录下存在很多文件名前六个有效字符相同的文件时
这种转换算法可以提升文件名转换的性能
因为它不需要经历很多次的文件名遍历

具体见Faster 8.3 Converted Long Filenames in NTFS
http://support.microsoft.com/kb/114816/en-us
3

评分人数

天的白色影子

TOP

  1.     if exist %%~a\. (dir /a:d /b %%~a)
复制代码
这是我常用的,把%%~a改为程序路径就可以了。
诚如前面所说的, if exist %%~a\nul  和  if exist %%~a\.  一样,有时并非万能,有时候会失灵,只有 dir /a:d  才是最真实的。但以上 If exist 在发生作用的情况下可以稍微提高点效率,因为启动 dir 是需要时间代价的。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

Vista用户表示鸭梨不大

C:\CUer>dir /b /ad
aa a

C:\CUer>if exist "C:\CUer\aa a\" echo yes
yes

C:\CUer>if exist "C:\CUer\aa b\" echo yes

C:\CUer>

TOP

11# CUer
11楼的代码XP SP3下也测试通过
天的白色影子

TOP

返回列表