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

ste*_*avy 3 windows scripting cmd batch-file

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

例如,像这样:

  • mkdir mydir - 成功(现在创建目录)
  • mkdir mydir\subdir- 成功(现在mydir包含subdir)
  • mkdir mydir-成功(文件夹已经存在,应该不会引发错误)
  • mkdir mydir\subdir-成功(文件夹已经存在,应该不会引发错误)

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

phu*_*clv 9

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

if not exist mydir\subdir md mydir\subdir
Run Code Online (Sandbox Code Playgroud)

或者您也可以重定向stderr

md mydir\subdir 2>NUL
Run Code Online (Sandbox Code Playgroud)

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

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

何时启用命令扩展

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

  • @steavy - 如果您发现这些解决方案过于复杂,那么您现在应该放弃批量生产. (7认同)
  • @eryksun - 有趣的边缘案例.没有扩展名的文件名很少见,但我明白你的观点.令人遗憾的是ERRORLEVEL对于现有文件和现有文件夹是相同的. (2认同)

Mof*_*ofi 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
Run Code Online (Sandbox Code Playgroud)

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

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

如果目录已存在,MD将输出错误.这可能有助于通知用户手动输入命令输入目录路径中可能存在的错误,因为用户可能想要创建新目录并且错误地输入了现有目录的名称.

但是对于命令MD的脚本使用,如果要创建的目录已存在,则此命令通常会输出错误消息.如果命令MD有一个选项,在创建已存在的目录并且在这种情况下退出时返回代码0,则输出错误消息将非常有用.但是没有这样的选择.

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

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

所以建议验证目录是否真的存在,这是通过以下方式完成的:

if not exist "%Directory%\*"
Run Code Online (Sandbox Code Playgroud)

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

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

@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
Run Code Online (Sandbox Code Playgroud)

如果无法创建目录结构,用户现在可以看到命令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
Run Code Online (Sandbox Code Playgroud)

有关运算符的详细信息||,&使用Windows批处理文件单行上阅读多个命令.

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

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

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

另请阅读有关使用命令重定向操作符的Microsoft文章.