使用批处理创建文件夹,但前提是它尚不存在

Bil*_*ill 410 windows cmd batch-file

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

  • 仅当文件夹尚不存在时才创建它

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

小智 581

你只需使用它:if not exist "C:\VTS\" mkdir C:\VTS只有当文件夹不存在时才会创建一个目录.

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

  • @ jpmc26对NUL的测试是为了确保你测试一个目录.否则,条件可能会评估为true,即使它是常规文件.这就是区别. (11认同)
  • 除了它是错的.你必须检查NUL设备,否则它将无法工作.比这个早三年看我的回答. (7认同)
  • @ jpmc26你是对的,一个尾部斜杠完成这项工作,实际上更可取,因为它适用于引号(因此允许你在目录路径中有空格).为了区分文件/目录,这将起作用:"如果存在"a"如果不存在"a"(回声"它是一个文件")else(echo"它是一个dir")`.关于你的最后一句话,我怀疑你的批处理文件在其他地方有问题. (6认同)
  • @MartinSchapendonk添加尾部斜杠就足够了吗?这似乎正确地区分了文件和目录,但是如果没有检测到文件,则存在一个缺点,即目录的创建将失败.我怀疑这也是测试"NUL"的问题. (3认同)
  • @MartinSchapendonk 据我从测试中得知,这适用于 Windows 7 和 Windows Server 2012,如果它不能至少在 XP 和 Windows 10 上运行,我会感到非常惊讶。您能提供条件吗?这行不通? (2认同)

Mar*_*onk 206

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

if not exist C:\VTS\NUL echo "Folder does not exist"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我个人更喜欢这个,因为当dir已经存在时它没有设置%errorlevel%(Agent_9191的答案返回错误代码为1) (12认同)
  • @YouHaveaBigEgo`NUL`与一个L. (3认同)
  • 实际上,尽管这个答案很好,但是它不能回答“创建目录”的问题:) (2认同)

Age*_*191 52

mkdir C:\VTS无论如何都要打电话.它只会报告该子目录已存在.

编辑:正如其他人所说,如果文件夹已存在,则会设置%ERRORLEVEL%.如果您的批处理(或任何调用它的进程)不关心错误级别,则此方法可以很好地工作.由于问题没有提到避免错误级别,这个答案是完全有效的.它满足创建文件夹(如果它不存在)的需要,并且它不会覆盖现有文件夹的内容.否则请按照Martin Schapendonk的回答.

  • 由于意外的错误消息/警告,这是一种不良行为. (17认同)
  • 在违反最佳做法的情况下调用"完全有效"的东西在理智上是不诚实的.另一个例子:当有人问你如何避免某个特定的安全问题时,你的答案不应该是"以管理员身份运行计算机",即使这个问题没有明确规定最低安全影响作为先决条件.:-) (10认同)
  • Errorlevel或errno没有错.它们是特定于平台的错误消息传递范例,它们的工作目的是为它们构建的.但无论平台或消息传递方法是什么,我都不建议"尝试做到这一点,如果失败就恢复"模式,当你可以轻松避免 - 并因此清晰地记录 - 常见的错误情况.因此,我确实发现"如果不存在"式的方法更优越.但是,我不想或不想过于深入讨论最佳实践的形成.我无意冒犯任何人,只是想澄清我的downvote. (4认同)
  • 简单地忽略错误的问题是你不知道*为什么*它失败了.它可能已失败,因为该目录已存在,因为用户没有该目录的权限,因为父路径不存在,或者因为磁盘失败."如果不存在则创建"应该在除第一个之外的所有情况下都失败.但是,这个答案在所有情况下都会导致错误.这就是为什么它不适合批处理脚本.-1 (4认同)
  • @JouniHeikniemi s/best practices/Jouni的个人喜好 (2认同)
  • @JouniHeikniemi imo,`%ERRORLEVEL%`是返回操作结果的好方法.它与C std库中的`errno`非常相似http://www.cplusplus.com/reference/cerrno/errno/有些人可以轻易地说C std库遵循/建立了某些组定义的"最佳实践" .我想我的观点是"最佳实践"是非常主观的,这个人的建议遵循某人的最佳实践(例如C std lib和其他人),所以在智力上称他不诚实似乎有点延伸. (2认同)

小智 36

mkdir C:\VTS 2> NUL
Run Code Online (Sandbox Code Playgroud)

创建一个名为VTS和输出A subdirectory or file TEST already exists到的文件夹NUL.

要么

(C:&(mkdir "C:\VTS" 2> NUL))&
Run Code Online (Sandbox Code Playgroud)

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


小智 29

set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)
Run Code Online (Sandbox Code Playgroud)

  • 正如其他人指出的那样,您可能已经在评分最高的答案中看到,如果您有一个名为“log”的文件,这将不起作用。这是一个微妙的区别,但它会导致脚本中难以发现的错误。 (2认同)

D3F*_*ULT 17

我使用这种方式,你应该在目录名的末尾添加一个反斜杠,以避免该文件存在于没有与你指定的目录同名的扩展名的文件中,从不使用"C:\ VTS",因为它可以是一个文件存在名称"VTS"保存在"C:"分区中,正确的方法是使用"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
Run Code Online (Sandbox Code Playgroud)

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

小智 16

您可以使用:

if not exist "C:\VTS\" mkdir "C:\VTS"
Run Code Online (Sandbox Code Playgroud)

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

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"
Run Code Online (Sandbox Code Playgroud)


小智 12

如果文件夹不存在,您需要创建一个文件夹吗?好吧,这里有一个如何操作的示例。

首先,我通过输入以下代码来检查该文件夹是否尚不存在:

if not exist "FOLDERPATH" ( 
    mkdir "FOLDERPATH"
)
Run Code Online (Sandbox Code Playgroud)

所以如果我运行代码。如果该文件夹已经存在,它将什么也不做。如果该文件夹已经存在,我们将执行以下操作:

if exist "FOLDERPATH" ( 
    rmdir /s /q "FOLDERPATH"
    mkdir "FOLDERPATH"
)
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行代码,它将重新创建该文件夹(如果它已经存在)。这是示例代码:

@echo off
cls

if not exist "C:\ExamplePath\" ( 
    echo Creating Folder...
    mkdir "C:\ExamplePath\"
    pause
)

if exist "C:\ExamplePath\" ( 
    echo Re-Creating Folder...
    rmdir /s /q "C:\ExamplePath"
    pause
)
Run Code Online (Sandbox Code Playgroud)

现在该if exist部分是可选的。如果该文件夹已经存在,您可以跳转到标签,如下所示:

if exist "FOLDERPATH" ( 
    goto :ExampleLabel
    
    :ExampleLabel
    echo Hi.
    pause
)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助解决您的问题。


Lum*_*ito 9

这应该适合你:

IF NOT EXIST "\path\to\your\folder" md \path\to\your\folder
Run Code Online (Sandbox Code Playgroud)

但是,还有另一种方法,但它可能不是 100% 有用:

md \path\to\your\folder >NUL 2>NUL
Run Code Online (Sandbox Code Playgroud)

这将创建文件夹,但如果文件夹存在,则不会显示错误输出。我强烈建议您使用第一个。第二个是如果你和另一个有问题。