批量创建文件夹,但前提是该文件夹尚不存在


440

有人可以告诉我如何在Windows批处理脚本中执行以下操作吗?(*.bat):

  • 仅在尚不存在的情况下创建一个文件夹

更详细地讲,我想创建一个VTSC:\驱动器上命名的文件夹,但前提是该文件夹尚不存在。我不想覆盖该文件夹的内容(如果该文件夹已经存在并且已执行该批处理)。


2
这个怎么样 ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Answers:


622

您只需要使用它:if not exist "C:\VTS\" mkdir C:\VTS仅当文件夹不存在时,它才会创建目录。

请注意,仅当VTS存在且为目录时,此存在测试才会返回true。如果它不存在或作为文件存在,则mkdir命令将运行,并会导致错误。您可能还需要检查VTS是否也作为文件存在。


7
除了那是错误的。您必须检查NUL设备,否则它将无法工作。请比这早三年见我的答案。
Martin Schapendonk

@MartinSchapendonk据测试表明,它可以在Windows 7和Windows Server 2012上运行,如果至少在XP和Windows 10之前无法运行,我会感到非常惊讶。这行不通吗?
jpmc26 2013年

12
对NUL进行@ jpmc26测试是为了确保您测试目录。否则,条件可能会评估为true,即使它是常规文件也是如此。那是区别。
Martin Schapendonk

3
@MartinSchapendonk加上斜杠就足够了吗?这似乎可以正确区分文件和目录,但是存在一个弱点,即如果未检测到文件,则目录创建将失败。我怀疑这也是测试的问题NUL
jpmc26,2013年

6
@ jpmc26是的,后跟斜杠可以完成此工作,实际上是可取的,因为它与引号一起使用(因此允许您在目录路径中保留空格)。要区分两个文件/目录,可以使用:if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir")。关于您的最后一句话,我怀疑您的批处理文件在其他地方有问题。
Marc.2377 '12

221
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

另请参阅https://support.microsoft.com/en-us/kb/65994

(2018年3月7日更新; Microsoft文章已关闭,存档在https://web.archive.org/web/20150609092521/https://support.microsoft.com/zh-cn/kb/65994


12
我个人比较喜欢这样做,因为当dir已经存在时,它不会设置%errorlevel%(Agent_9191的答案返回错误代码1)
csauve 2012年

1
它也很好,很通用,可以应用于您要有条件执行的所有其他操作:)
John Humphreys-w00te 2012年

3
@YouHaveaBigEgo NUL是一个L.
马丁Schapendonk

1
链接不再有效,但Internet存档中
fernio

3
实际上,尽管这个答案很好,但是它并不能回答“创建目录”的问题:)
Jean-Francois T.

55

随便打电话mkdir C:\VTS。它只会报告子目录已经存在。

编辑:正如其他人所指出的,如果文件夹已经存在,这的确会设置%ERRORLEVEL%。如果您的批处理(或任何调用它的进程)不关心错误级别,则此方法很好用。由于该问题未提及避免错误级别,因此此答案完全正确。它可以满足创建文件夹(如果该文件夹不存在)的需求,并且不会覆盖现有文件夹的内容。否则,请遵循Martin Schapendonk的回答


20
由于意外的错误消息/警告,这是不良行为。
2013年

10
当它违反最佳做法时称其为“完全有效”在理论上是不诚实的。再举一个例子:当有人问您如何避免某个特定的安全问题时,即使该问题没有明确规定最低的安全影响为前提,您的答案也不应该是“以管理员身份运行计算机”。:-)
Jouni Heikniemi 2014年

2
@JouniHeikniemi s /最佳做法/ Jouni的个人喜好
dss539

4
Errorlevel或errno都没错。它们是特定于平台的错误消息传递范例,并且可以按其构建目的进行工作。但是,无论平台或消息传递方法是什么,当您可以轻松避免(从而清楚地记录)常见错误情况时,我不建议您尝试“尝试执行此操作并在失败时恢复”模式。因此,我确实发现“如果不存在”式的方法更好。但是,我不想或不在乎关于最佳实践形成的辩论。我无意冒犯任何人,只是想澄清我的反对意见。
Jouni Heikniemi 2015年

4
简单地忽略该错误的问题是您不知道为什么会失败。由于目录已经存在,用户对该目录没有权限,父路径不存在或磁盘发生故障,它可能会失败。除第一种情况外,“在不存在时创建”应该在所有情况下都失败。但是,此答案在所有情况下都会导致错误。这就是为什么它不适用于批处理脚本的原因。-1
jpmc26,2013年

38
mkdir C:\VTS 2> NUL

创建一个名为的文件夹VTS并输出A subdirectory or file TEST already existsNUL

要么

(C:&(mkdir "C:\VTS" 2> NUL))&

将驱动器号更改为C:,将mkdir错误输出到NUL并运行下一个命令。


有没有办法在PowerShell中使这项工作有效?它似乎不支持NUL作为输出文件。
亚伦弗兰克

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
正如其他人指出的那样,您可能已经在评分最高的答案中看到了,如果您有一个名为的文件,则此方法将无效log。这是一个细微的差异,但是会导致脚本中难以发现的错误。
亚伯

20

我使用这种方式,您应该在目录名称的末尾加上一个反斜杠,以避免该位置存在于文件中,且没有扩展名,该扩展名与您指定的目录相同,请不要使用“ C:\ VTS”,因为它可以存储文件存在名称保存在“ C:”分区中的名称“ VTS”,正确的方法是使用“ C:\ VTS \”,在VTS之后检查反斜杠,正确的方法是。

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit

3
解决方案特别有趣的是,您使用!errorlevel!,即延迟扩展。否则,ERRORLEVEL将在输入第一个变量之前if(即在分析时)对变量进行解析。现在,它在执行时被解析,因此可以捕获的结果mkdir。即使在测试存在性的同时,您也应该测试成功(例如:例如访问被拒绝错误)。与其他人相比,非常好的解决方案,+ 10!
亚伯

17

您可以使用:

if not exist "C:\VTS\" mkdir "C:\VTS"

您还可以扩展代码以替换任何缺少的预期文件。

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

0

我为我的剧本创建了这个脚本,用于我的眼梁工作。

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
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.