在批处理脚本中创建文件夹并忽略它是否存在

Create folder in batch script and ignore if it exists

如何在批处理脚本中创建文件夹(和任何子文件夹)?但重要的是,如果文件夹(或任何子文件夹)已经存在,它不应该 return 错误。

例如,像这样:

我真正需要的只是确保文件夹结构存在。

需要检查路径,不存在则创建

if not exist "mydir\subdir" md "mydir\subdir"

或者您也可以通过重定向 stderr

来抑制错误消息
md "mydir\subdir" 2>NUL

您不需要先 运行 mkdir mydir 因为

Command extensions, which are enabled by default, allow you to use a single md command to create intermediate directories in a specified path.

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/md

另见 https://ss64.com/nt/md.html

创建目录结构的标准方法是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

md "%Directory%" 2>nul
if not exist "%Directory%\*" (
    echo Failed to create directory "%Directory%"
    pause
    goto :EOF
)

rem Other commands after successful creation of the directory.
endlocal

默认情况下启用命令扩展并禁用延迟扩展。上面的批处理代码明确设置了这个环境。

命令 MD 使用启用的命令扩展创建指定目录的完整目录结构。

如果目录已经存在,

MD 输出错误。这可能有助于通知手动输入命令的用户有关输入的目录路径中可能存在的错误,因为这可能是用户想要创建一个新目录并且错误地输入了一个已经存在的目录的名称。

但是对于命令 MD 的脚本用法,如果要创建的目录已经存在,则此命令输出错误消息通常是一个问题。如果命令 MD 可以选择不输出错误消息,以防要创建的目录已经存在并以 return 代码 0 退出,在这种情况下,这将非常有用。但是没有这个选项。

上面的解决方案创建了目录并通过将其从句柄 STDERR 重定向到设备 NUL.[= 来抑制可能输出的错误消息33=]

但是由于目录路径中的字符无效,驱动器不可用(在使用完整路径时),目录的创建可能会失败,路径中的任何地方都有一个指定目录名称的文件,NTFS 权限没有允许创建目录等

因此建议验证目录是否确实存在,这是通过以下方式完成的:

if not exist "%Directory%\*"

重要的是目录路径现在以 \* 结尾或至少以反斜杠结尾。否则,在目录 mydir\subdir 1 中有一个名称为 subdir 2 的文件的示例可能是可能的,尽管没有目录 [=15],但在使用条件 if not exist "%Directory%" 时将评估为 false =].

当然也可以先检查目录,如果目录不存在则创建目录。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" (
    md "%Directory%"
    if errorlevel 1 (
        pause
        goto :EOF
    )
)

rem Other commands after successful creation of the directory.
endlocal

如果无法创建目录结构,用户现在可以看到命令 MD 输出的错误消息并简要说明原因。

这个批处理代码可以使用运算符 ||:

写得更紧凑
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" md "%Directory%" || (pause & goto :EOF)

rem Other commands after successful creation of the directory.
endlocal

有关运算符 ||& 的详细信息,请阅读 Single line with multiple commands using Windows batch file 上的答案。

命令 ENDLOCAL 未在 之前使用,因为此命令还需要启用命令扩展。 Windows 命令解释器在离开执行批处理文件时隐式执行此命令。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • md /?
  • pause /?
  • set /?
  • setlocal /?

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章。