The defaultWindows 桌面目录的定义为%USERPROFILE%\Desktop
. USERPROFILE
是预定义之一Windows环境变量 https://en.wikipedia.org/wiki/Environment_variable#Windows.
所以可以只使用:
md "%UserProfile%\Desktop\NewDirectory" 2>nul
这将创建一个名为NewDirectory
只要用户没有更改桌面目录的默认值,就可以在用户的桌面上保存。命令md
可以与完全限定的目录路径或相对目录路径一起使用。运行时的帮助输出命令提示符 https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/ md /?
解释说md
如果默认启用命令扩展,则将整个目录树创建到不存在的目录。另请参阅 Microsoft 文档命名文件、路径和名称空间 https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file.
但最好从 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"
执行后成为第一个for
命令set "DesktopFolder=%USERPROFILE%\Desktop"
。该命令被第二次解析cmd.exe
类似的东西set "DesktopFolder=C:\Users\UserName\Desktop"
因为命令call
在真正执行命令之前set
定义环境变量DesktopFolder
使用从 Windows 注册表中读取的真实绝对文件夹名称。
-
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
此注册表项包含与上面的注册表项几乎相同的字符串值,但字符串值通常是类型REG_SZ
。此注册表项用于向下兼容不支持其他注册表项以及环境变量引用的字符串值的应用程序。
shell 文件夹可能仅在两个注册表项之一中定义。例如,在 Windows XP 上,字符串值Administrative Tools
, CD Burning
, Fonts
and Recent
仅存在于注册表项下Shell Folders
并且在密钥下不存在User Shell Folders
.
信息添加者Compo https://stackoverflow.com/users/6738015/compo:
-
Windows 本身默认使用 key 下定义的字符串值User Shell Folders
并使用 key 下定义的字符串值Shell Folders
仅当密钥下不存在时User Shell Folders
.
-
Windows 不会传播对 key 下的字符串值的修改User Shell Folders
到 key 下具有相同名称的字符串值Shell Folders
如果用户或程序直接在注册表中修改键下的字符串值User Shell Folders
没有对键下具有相同名称的键进行适当的更改Shell Folders
.
所以如果是Desktop
in User Shell Folders
包含与以下不同的目录路径Desktop
in Shell Folders
,Windows 使用定义的路径Desktop
in User Shell Folders
.
用户可以自由地将任何文件夹更改为用户想要的任何内容。但用户必须注意更改现有两次注册表项中的字符串值。一些 shell 文件夹可以通过 Windows 图形用户界面或 Windows 应用程序(例如Downloads
外壳文件夹。
另请参阅 Microsoft 文档已知文件夹 https://learn.microsoft.com/en-us/windows/win32/shell/known-folders and 已知文件夹ID https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid以及这些页面上引用的其他文档页面以及有关的文档申请登记 https://learn.microsoft.com/en-us/windows/win32/shell/app-registration.
这是一个批处理文件,它尽可能安全地从 Windows 注册表获取用户的桌面目录。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DesktopFolder="
for /F "skip=2 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=2 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 上运行reg.exe
输出的查询结果不同于reg.exe
Windows Vista 和更新的 Windows 版本。
请参阅 Microsoft 文章:使用命令重定向运算符 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490982(v=technet.10)的解释2>nul
它重定向命令输出的错误消息MD在已经存在的目录上处理STDERR到设备NUL来抑制此错误消息。
但是,用户的桌面目录应仅包含快捷方式文件(*.lnk
文件)以及用户在桌面上创建的文件和目录。任何程序都不应在用户桌面目录中创建除快捷方式文件之外的其他文件。 Microsoft 为应用程序定义了其他几个 shell 文件夹,例如APPDATA
(申请数据)或LOCALAPPDATA
(本地应用程序数据)用于应用程序。
有关处理字符串值的一些其他事实Desktop
在按键下User Shell Folders
and Shell Folders
根据 Windows XP SP3 x86 的观察,在更改当前用户的注册表配置单元后始终重新启动 Windows:
-
字符串值的路径字符串的改变Desktop
在钥匙下User Shell Folders
例如来自%USERPROFILE%\Desktop
to %USERPROFILE%\MyDesktop
当然还有目录的创建%USERPROFILE%\MyDesktop
将 Windows 桌面目录更改为自定义%USERPROFILE%\MyDesktop
下次登录时以及字符串值Desktop
下键Shell Folders
Windows 会在下次重新启动时进行调整。我没有测试过如果Desktop
在键下Shell Folders
也适用于仅进行注销和登录。两者都改变肯定是更好的选择Desktop
同时使用字符串值将桌面目录永久更改为与默认目录不同的目录%USERPROFILE%\Desktop
.
-
已删除或重命名的字符串值Desktop
在钥匙下User Shell Folders
Windows 永远不会重新创建。所以这个字符串值可能不存在,如果Desktop
在钥匙下User Shell Folders
一旦被错误删除或重命名或注册表文件部分损坏,导致该字符串值不存在。正如下面的进一步测试所示,用户不会注意到该问题。
-
字符串值Desktop
类型的REG_SZ
下键Shell Folders
始终设置为扩展路径%USERPROFILE%\Desktop
如果字符串值Desktop
类型的REG_EXPAND_SZ
下键User Shell Folders
根本不存在。 Windows 也会创建该目录%USERPROFILE%\Desktop
如果在此错误处理情况下不存在,则自动
-
如果字符串值Desktop
类型的REG_SZ
下键Shell Folders
and字符串值Desktop
类型的REG_EXPAND_SZ
下键User Shell Folders
are both由用户或程序删除或重命名,Windows 在下次启动时创建字符串值Desktop
类型的REG_SZ
下键Shell Folders
扩展路径为%USERPROFILE%\Desktop
并创建目录(如果不存在)。字符串值Desktop
类型的REG_EXPAND_SZ
下键USer Shell Folders
is not由 Windows 重新创建。
-
如果字符串值Desktop
类型的REG_SZ
下键Shell Folders
存在与不同的扩展路径%USERPROFILE%\Desktop
就像扩展路径一样%USERPROFILE%\MyDesktop
和字符串值Desktop
类型的REG_EXPAND_SZ
在钥匙下User Shell Folders
根本不退出,Windows忽略自定义路径Desktop
类型的REG_SZ
在钥匙下Shell Folders
并将值设置为扩展路径%USERPROFILE%\Desktop
并另外创建目录%USERPROFILE%\Desktop
如果尚未存在。因此,如果没有使用字符串值定义自定义桌面目录,则无法使用自定义桌面目录Desktop
类型的REG_EXPAND_SZ
在钥匙下User Shell Folders
.
我没有在 Windows 上使用较新版本进行有关处理的测试Desktop
在按键下Shell Folders
and User Shell Folders
如果一个或两个字符串值不存在和/或具有相同或不同的目录路径和/或具有与默认值不同的目录路径。