首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在批处理脚本中创建文件夹,如果存在则忽略它

在批处理脚本中创建文件夹,如果存在则忽略它
EN

Stack Overflow用户
提问于 2017-07-05 16:32:13
回答 2查看 48.8K关注 0票数 9

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

例如,如下所示:

  • mkdir mydir -成功(现在创建了目录)
  • mkdir mydir\subdir -成功(现在mydir包含subdir)
  • mkdir mydir -成功(文件夹已经存在,如果而不是抛出错误)
  • mkdir mydir\subdir -成功(文件夹已经存在,如果而不是抛出错误)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-06 17:55:32

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

代码语言:javascript
运行
复制
@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的情况下不输出错误消息,这将是非常有帮助的。但没有这样的选择。

上面的解决方案创建了目录,并通过将其从handle STDERR重定向到device NUL来抑制可能的输出错误消息。

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

因此,建议验证目录是否确实存在,该目录是通过以下操作完成的:

代码语言:javascript
运行
复制
if not exist "%Directory%\*"

重要的是,目录路径现在以\*结束,或者至少以反斜杠结束。否则,就有可能在目录subdir 2中出现一个名为mydir\subdir 1的文件,在使用条件if not exist "%Directory%"时,该文件的计算值为false,尽管没有目录subdir 2

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

代码语言:javascript
运行
复制
@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输出的错误消息,简要解释原因。

使用运算符||可以编写更紧凑的批处理代码。

代码语言:javascript
运行
复制
@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

有关操作符||&的详细信息,请阅读使用Windows批处理文件使用多条命令的单行上的答案。

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

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。

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

还可以阅读微软关于使用命令重定向运算符的文章。

票数 9
EN

Stack Overflow用户

发布于 2017-07-05 16:44:28

您需要检查路径并创建不存在的路径

代码语言:javascript
运行
复制
if not exist "mydir\subdir" md "mydir\subdir"

也可以通过重定向stderr来抑制错误消息。

代码语言:javascript
运行
复制
md "mydir\subdir" 2>NUL

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

默认启用的命令扩展允许您使用单个md命令在指定路径中创建中间目录。 https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/md

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44931623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档