在Windows中使用单个命令创建多个路径的文件夹

10
@echo off
set "var=string"
set "today=%date:~10,4%-%date:~7,2%-%date:~4,2%"
set "path_backup=\\SGSINWPDFS01v\SG\OTHERS\IT\OTHERS\WORKSTATIONS\SCHEDULE"
set "path_sourcepst01=AppData\Local\Microsoft\Outlook"
set "path_sourcepst02=Desktop"
set "path_sourcepst03=My Documents\PST"
set "path_sourcepst04=My Documents\Outlook"
set "path_sourcepst05=My Documents\Outlook Files"
mkdir "%path_backup%\%username%\%today%"
mkdir "%path_backup%\%username%\%today%\PST"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst01%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst02%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst03%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst04%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst05%"

我在上面的代码中进行了如下修改。 但是系统仍然无法在sourcepst01、03、04和05创建文件夹。 sourcepst02正常运行。

似乎我不能一次性MKDIR整个路径,系统会混淆,必须逐个进行。 我是否漏掉了什么?


请注意,您不需要第一个“mkdir”命令。 “mkdir”会自动创建所请求路径中的所有文件夹。 - nobody
你可以考虑在mkdir行后面添加2>nul来抑制directory already exists消息,以防cmd认为需要通知你。 - Magoo
@AndrewMedico 不,它没有起作用。它不允许创建第二个路径。 - m.k.frenky
您是在网络机器上创建它们吗?您是否收到“访问被拒绝”的错误? - foxidrive
5个回答

12

添加以下行:

setlocal enableextensions

在批处理文件的@echo off行后面加上它,这将使mkdir能够创建任何中间目录。

help mkdir的一部分输出:

If Command Extensions are enabled MKDIR changes as follows:

MKDIR creates any intermediate directories in the path, if needed.
For example, assume \a does not exist then:

    mkdir \a\b\c\d

is the same as:

    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d

which is what you would have to type if extensions were disabled.

我不认为那会有影响,但是批处理命令中的所有怪癖我也不能确定。另外,正如Magoo在另一条评论中提到的,命令扩展通常默认启用。因此,如果 setlocal enableextensions 最终有所帮助,您可能需要阅读 help cmd 的输出以了解如何禁用它并解决该问题。 - Michael Burr

7
在路径周围加上引号。
mkdir "%foo%\%bar%\%somename%"

问题在于名称中有空格,mkdir将其解释为两个参数而不是单个名称。引号将强制它将所有内容解释为单个路径。

5
是的,它可以。如果对您不起作用,请澄清您收到的错误信息。 - foxidrive

2
约翰·德特斯已经找到了问题所在-但我建议
set "path_sourcepst4=My Documents\Outlook"
mkdir "%path_backup%\%username%\PST-%date:~10,4%-%date:~7,2%-%date:~4,2%\%path_sourcepst4%"

使用“set“var = string”格式将确保设置到变量中的值不包含行末的任何杂散(并且在很大程度上是看不见的)尾随空格。你只需要被那一个抓住一次......它还减少了被解析的键盘字符数。
为什么不设置一个名为“yyyymmdd”的变量,将其设置为“%date:~10,4%-%date:~7,2%-%date:~4,2%”,以便不重复该字符串?

我添加了新的变量: @echo off set "var=string" set "today=%date:10,4%-%date:7,2%-%date:~4,2%"但在%today%之后的第二个路径仍然无法工作。 - m.k.frenky
“set“var=字符串”是一般的语句格式。set "today=%date:~10,4%-%date:~7,2%-%date:~4,2%" 是具体实例,其中 vartoday,而 string%date:~10,4%-%date:~7,2%-%date:~4,2%,它的意思是 “从位置 10 开始长度为 4 的字符是 date 的内容”-“从位置 7 开始长度为 2 的字符是 date 的内容”-“从位置 4 开始长度为 2 的字符是 date 的内容” (第一个字符在位置 0)。这被分配给变量 today。括号中的引号确保行尾的任何空格都 不会 包含在赋值中。 - Magoo
Michael Burr的回答非常有道理。在极少数情况下,有人故意关闭了自1996年以来内置在CMD中的增强设施。默认情况下,这些扩展是启用的,并且通常会假定扩展已启用。 - Magoo

2
@echo off
set "var=string"
set "today=%date:~10,4%-%date:~7,2%-%date:~4,2%"
set "path_backup=\\SGSINWPDFS01v\SG\OTHERS\IT\OTHERS\WORKSTATIONS\SCHEDULE"
set "path_sourcepst01=AppData\Local\Microsoft\Outlook"
set "path_sourcepst02=Desktop"
set "path_sourcepst03=My Documents\PST"
set "path_sourcepst04=My Documents\Outlook"
set "path_sourcepst05=My Documents\Outlook Files"
subst b: "%path_backup%"
mkdir "%path_backup%\%username%\%today%"
mkdir "%path_backup%\%username%\%today%\PST"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst01%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst02%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst03%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst04%"
mkdir "%path_backup%\%username%\%today%\PST\%path_sourcepst05%"
subst b: /D

我找到了问题,似乎在网络驱动器上无法创建多级子文件夹。将其映射到本地驱动器可以解决这个问题。

你知道网络共享所在的服务器是什么类型吗?我可以在这里使用UNC路径创建多个目录,因此我想知道是否是网络服务器导致了故障? - Michael Burr
我也遇到了这个问题,即“mkdir”命令无法在映射的网络驱动器上的单个命令中创建嵌套目录。我不确定为什么会这样,但我们毕竟是在谈论微软——我说得对吧? - ariestav

0

问题可能是由于文件夹深度的嵌套级别。

我相信支持的最大目录级别为8级,另一个限制是总长度为260个字符。


我从未听说过8级目录限制,但也许这取决于网络?路径名看起来应该远远低于260个字符。 - Michael Burr
也许这是FAT32的限制吗?我刚刚在NTFS本地驱动器上尝试了一下,可以成功创建一个有9层深度的文件夹。 - foxidrive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接