如何检查Windows中是否存在目录?


59

我想将此Linux / Bash脚本转换为Windows Shell:

if test -d myDirName; then echo "ok"; else mkdir myDirName; fi

它测试目录是否存在,如果不存在,则创建它。


3
实际的linux / bash命令将是:mkdir -p myDirName。花了几天的时间尝试将相对简单的bash脚本转换为batch-sh * t(将函数的结果分配给变量?)之后,我决定让人们安装cygwin。
迈克尔

Answers:


73
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

由Barlop添加

尽管以上内容适用于这种特定情况,但标题中提到的是专门针对目录进行测试。普格的评论使用的if exist mydirname\不是而是if exist mydirname方式。一些答案使用了\ nul,但是\ nul在NT中是有问题的。不包括尾部反斜杠将测试文件或目录。因此,对于目录,请在结尾加上反斜杠。


23
这对于测试文件是否存在是正确的,但是您怎么知道它是目录?最简单的答案就是if exist mydirname\ 您所说的其余答案。或者,您实际上可以获取test二进制文件并在Windows上使用它。
phogg 2010年

@phogg:在此特定问题的上下文中:如果它存在但是文件,则仍然不能mkdir
grawity 2011年

@grawity:如果存在但为文件,则脚本稍后尝试将其用作目录时可能会失败,这可能不是您想要的。
phogg 2011年

我如何检查是否不存在?
Sungguk Lim 2014年

1
@sunglim,通过类似地写出“如果不存在myDirName \” if not 1==1 echo hmm 或是否存在myDirName \ ELSE
等等

20

这是我刚刚发现的:

您可以测试是否存在nul文件。如果目录存在,它将包含一个nul文件;如果该nul文件不存在,则该目录不存在。

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1-在所有Windows和MS-DOS版本中都可以使用,而不同于普通的if exist dirnameWindows NT。
grawity 2011年

这是一个愚蠢的代码,与linux mkdir -p myDirName相比:p
Kit Ho

6
它应该是反斜杠,而不是正斜杠。
弥敦道(Nathan Garabedian)

@grawity您怎么看待这个问题,显然在做\ nul时会遇到一些问题?dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop:我认为cmd.exe是现有的最差的脚本语言之一,并且尽可能使用PowerShell或其他替代方法。至于\nul,在Windows NT中不再是必需的,普通if exist "C:\Program Files (x86)"
格式

11

使用反斜杠,而不是正斜杠:myDirName\nulmyDirName/nul

md foo 
echo.>bar 
for %I in (foo bar xyz) do @( 
  if exist %I ( 
    if exist %I\nul ( 
      echo -- %I is a directory 
    ) else ( 
      echo -- %I is a file 
    ) 
  ) else ( 
    echo -- %I does not exist 
  ) 
)

-foo是目录
-bar是文件
-xyz不存在

编辑:这仅在目录名称不包含空格时有效


5

有些人建议做\ nul,但是在NT中似乎无法可靠地工作

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

http://www.dostips.com/forum/viewtopic.php?f=3&t=4913

foxidrive writes-

The trick with nul worked in pre NT versions of windows.

Now you would use this, with a trailing backslash.

if exist "C:\abcde\" echo the folder exists

再问一个问题

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes

C:\blah>

4

我想知道为什么乔在我在Windows 7上遇到过同样的问题时感到沮丧

如果存在文件名\ NUL

对于文件和目录都返回TRUE。我在www.robvanderwoude.com/battech_ifexistfolder.php找到了另一种解决方案,并提出了DVF FOR循环的修订版:

FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )

谢谢,那是唯一可行的解​​决方案。我添加了一个“ 2> NUL”来避免出现错误消息,并将回显值更改为1(目录存在),0(目录不存在),-1(存在同名文件)FOR%A IN(“ C:\ temp \ foo \ HELLO WORLD5“)做@((PUSHD”%A“ 2> NUL &&(POPD&ECHO 1)||(如果存在%A(ECHO -1)ELSE(ECHO 0
Christoph

(对不起,尽管尝试了很多事情,我还是没有设法将代码格式化为代码:-(直到编辑注释在5分钟后超时:
Christoph

1

我看到许多文件和文件夹区分问题。有没有人尝试在检查它存在之后简单地将其插入cd?然后cd将成功或失败。

set MyDir = "MyTestDir"
IF exist MyDir (
    cd MyDir 
    IF ERRORLEVEL NEQ 0 (
        echo "Error: %MyDir% already exists, but it is a file!"
        exit 1
    ) else (
        # Do not forget to cd back
        cd ..
    )
) else (
   # Did not exist yet, so create it.
   mkdir MyDir
)

(1)如果要使用变量,请使用变量。MyDir第一行之后的所有出现都应为%MyDir%。(2)cd ..如果%MyDir%是多级路径名(例如Pictures\cats),甚至是绝对路径名(例如),都不会做您想要的 \Windows。考虑使用pushd/ popd和/或setlocal
斯科特(Scott)

0
exist myDirName/nul

如果myDirName是文件,也是如此,不是搜索的功能


1
C:\blah>touch abe<ENTER>C:\blah>if exist abe\nul echo err<ENTER> C:\blah>if exist abe/nul echo err<ENTER>C:\blah>我不喜欢\ nul在NT中,但事实并非如此。您应该已经给出了一些输出。
barlop 2014年

-1

查找文件夹并不难。我的解决方案,使用perl:

for($ cnt = $#ARGV; $ cnt> = 0;-$ cnt)
{
   如果(-d“ $ ARGV [$ cnt]”){ 
      打印“ argv [$ cnt] = $ ARGV [$ cnt]是一个文件夹\ n”;
      $ dir = $ ARGV [$ cnt];
      打破;
   }其他{
      打印“ argv [$ cnt] = $ ARGV [$ cnt]不是文件夹\ n”;
   }
}

我不明白
Pierre.Vriens
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.