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

时间:2017-07-05 16:32:13

标签: windows batch-file cmd scripting

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

例如,像这样:

  • mkdir mydir - 成功(现在已创建目录)
  • mkdir mydir\subdir - 成功(现在mydir包含subdir
  • mkdir mydir - 成功(文件夹已存在,会抛出错误)
  • mkdir mydir\subdir - 成功(文件夹已存在,会抛出错误)

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

2 个答案:

答案 0 :(得分:9)

您需要检查路径并创建它是否不存在

if not exist mydir\subdir md mydir\subdir

或者你也可以重定向stderr

md mydir\subdir 2>NUL

您不需要先运行mkdir mydir,因为

  

如果需要,MD会在路径中创建任何中间目录。

启用命令扩展时

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

答案 1 :(得分:6)

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

@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 可以选择在目录创建已存在的情况下不输出错误消息并在这种情况下以返回码0退出,那将非常有用。但是没有这样的选择。

上面的解决方案创建了目录并禁止输出错误消息,并将其从句柄 STDERR 重定向到设备 NUL

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

因此建议验证目录是否真的存在,这完成于:

if not exist "%Directory%\*"

目录路径现在以\*结束或至少使用反斜杠很重要。否则,示例可能会在目录subdir 2中存在名称为mydir\subdir 1的文件,其中条件if not exist "%Directory%"的使用将评估为false,尽管没有目录{{1 }}

当然也可以先进行目录检查,然后创建目录(如果尚未存在)。

subdir 2

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

使用运算符@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

可以更紧凑地编写此批处理代码
||

有关运营商@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上的答案。

goto :EOF之前未使用 ENDLOCAL 命令,因为此命令还需要启用命令扩展。 Windows命令解释程序在执行批处理文件时执行此命令。

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

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

另请阅读Microsoft有关Using Command Redirection Operators

的文章