首页 > 解决方案 > 如何在用户的桌面目录中创建目录?

问题描述

所以我正在制作一个批处理文件,我将把它放在启动文件夹中。我需要在当前用户的桌面目录中创建一个目录。我只知道如何在当前目录下新建一个目录。

我知道如何创建目录的唯一方法是使用 command mkdir

标签: batch-file

解决方案


Windows 桌面目录的默认值是用%USERPROFILE%\Desktop. USERPROFILE是预定义的Windows 环境变量之一。

所以可以只使用:

md "%UserProfile%\Desktop\NewDirectory" 2>nul

NewDirectory只要用户没有更改桌面目录的默认值,这将在用户的桌面上创建一个具有名称的目录。该命令md可以与完全限定的目录路径或相对目录路径一起使用。在命令提示符 下运行的帮助输出md /?解释说,md如果默认启用命令扩展,则将整个目录树创建到一个不存在的目录。另请参阅有关命名文件、路径和命名空间的 Microsoft 文档。

但最好从 Windows 注册表中获取桌面目录路径,而不是简单地使用默认值。有两个注册表项包含一个字符串值,名称Desktop为用户桌面目录的路径:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    此注册表项包含几个通常类型的字符串值,REG_EXPAND_SZ这些值定义了为当前用户帐户定义的各种 shell 文件夹的路径。shell 文件夹通常包含一个环境变量引用%USERPROFILE%,这就是类型的原因,REG_EXPAND_SZ这意味着必须额外扩展字符串值以获得 shell 文件夹的绝对路径。下面的批处理文件通过使用命令CALL来扩展环境变量引用,以强制 Windows 命令处理器再解析一个命令行。
    例如,命令在执行命令set "DesktopFolder=%%~K"时成为第一个。由于该命令,该命令被第二次解析为类似的东西forset "DesktopFolder=%USERPROFILE%\Desktop"cmd.exeset "DesktopFolder=C:\Users\UserName\Desktop"call在真正执行命令之前,使用从 Windows 注册表读取的真正绝对文件夹名称set来定义环境变量。DesktopFolder

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    此注册表项包含与上述注册表项几乎相同的字符串值,但字符串值通常为REG_SZ. 此注册表项用于向下兼容不支持其他注册表项的应用程序,该注册表项具有带有环境变量引用的字符串值。

外壳文件夹可能仅在两个注册表项之一中定义。例如,在 Windows XP 上,字符串值,Administrative Tools和仅存在于注册表项下,不存在于 key 下。CD BurningFontsRecentShell FoldersUser Shell Folders

Compo添加的信息:

  1. Windows 本身默认使用 key 下定义的字符串值,并且仅当 key 下不存在时才User Shell Folders使用 key 下定义的字符串值。Shell FoldersUser Shell Folders

  2. 如果用户或程序直接在注册表中修改 key 下的字符串值,而没有对 key 下的同名键进行适当的更改,Windows 不会将对 keyUser Shell Folders下的字符串值的修改传播到 key 下的同名字符串值。 因此,如果in包含与 in 不同的目录路径,  Windows 将使用in定义的路径。Shell FoldersUser Shell FoldersShell Folders
    DesktopUser Shell FoldersDesktopShell FoldersDesktopUser Shell Folders

用户可以自由地将任何文件夹更改为用户想要的任何文件夹。但是用户必须注意在现有的两个注册表项中更改字符串值两次。一些 shell 文件夹可以通过 Windows 图形用户界面或 Windows 应用程序(如Downloadsshell 文件夹)上的选项轻松修改。

另请参阅已知文件夹KNOWNFOLDERID的 Microsoft 文档以及这些页面上引用的其他文档页面以及有关应用程序注册的文档。

这是一个批处理文件,它尽可能安全地从 Windows 注册表中获取用户的桌面目录。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "DesktopFolder="
for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder set "DesktopFolder=\"
if "%DesktopFolder:~-1%" == "\" set "DesktopFolder=%DesktopFolder:~0,-1%"
if not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"

md "%DesktopFolder%\NewDirectory" 2>nul

endlocal

这个批处理文件甚至可以在 Windows XP 上工作,在 Windows XP 上reg.exe输出的查询结果与reg.exeWindows Vista 和更新的 Windows 版本不同。

请参阅有关使用命令重定向运算符的Microsoft 文章,了解其中将命令MD2>nul输出的错误消息重定向到已经存在的目录以处理STDERR到设备NUL以抑制此错误消息的说明。

但是,用户的桌面目录应该只包含快捷方式文件(*.lnkfiles)和用户在桌面上创建的文件和目录。除快捷方式文件外,任何程序都不应在用户的桌面目录中创建其他文件。Microsoft 为应用程序定义了其他几个 shell 文件夹,例如APPDATA(应用程序数据)或LOCALAPPDATA(本地应用程序数据)应用程序。


Desktop关于在键User Shell Folders和Windows 下处理字符串值的一些额外事实,Shell Folders如在 Windows XP SP3 x86 中观察到的,在更改当前用户的注册表配置单元后总是重新启动 Windows:

  1. Desktop键下字符串值的路径字符串的更改,User Shell Folders例如 from %USERPROFILE%\Desktopto%USERPROFILE%\MyDesktop和目录的创建当然会在下次登录时%USERPROFILE%\MyDesktop将 Windows 桌面目录更改为自定义,并且在下次重新启动时 Windows 会调整下键%USERPROFILE%\MyDesktop的字符串值。如果在密钥下也适用于只是注销并登录,我没有测试过。最好同时更改两个字符串值,以将桌面目录永久更改为不同于默认的目录。DesktopShell FoldersDesktopShell FoldersDesktop%USERPROFILE%\Desktop

  2. Windows 永远不会重新创建Desktop键下已删除或重命名的字符串值。User Shell Folders因此,如果Desktop该键下的键User Shell Folders被错误地删除或重命名或注册表文件部分损坏导致该字符串值不存在,则该字符串值可能不存在。正如下面的进一步测试所示,用户不会注意到该问题。

  3. keyDesktop下类型的字符串值始终设置为如果key下类型的字符串值根本不存在的扩展路径。如果此错误处理案例中不存在该目录, Windows 也会自动创建该目录REG_SZShell Folders%USERPROFILE%\DesktopDesktopREG_EXPAND_SZUser Shell Folders%USERPROFILE%\Desktop

  4. 如果key 下 type 的字符串值和 keyDesktoptype的字符串值都用户或程序删除或重命名,Windows 会在下次启动时创建 key 下 type 的字符串值,扩展路径为现存的。Windows不会重新创建key 下的type的字符串值。REG_SZShell Folders DesktopREG_EXPAND_SZUser Shell FoldersDesktopREG_SZShell Folders%USERPROFILE%\DesktopDesktopREG_EXPAND_SZUSer Shell Folders

  5. 如果keyDesktop下 type的 string 值存在的扩展路径与like expand path of不同,并且key 下type的 string 值根本不存在,Windows 将忽略key下 type的自定义路径并将值设置为如果目录不存在,则扩展路径并另外创建目录。因此,如果没有定义自定义桌面目录,则无法使用自定义桌面目录,并在 key 下使用类型为字符串的值。REG_SZShell Folders%USERPROFILE%\Desktop%USERPROFILE%\MyDesktopDesktopREG_EXPAND_SZUser Shell FoldersDesktopREG_SZShell Folders%USERPROFILE%\Desktop%USERPROFILE%\DesktopDesktopREG_EXPAND_SZUser Shell Folders

我没有在 Windows 上对较新版本Desktop的密钥下的处理Shell Folders以及User Shell Folders一个或两个字符串值是否不存在和/或具有相同或不同的目录路径和/或具有与默认值不同的目录路径进行测试。


推荐阅读