所以我正在制作一个批处理文件,我将把它放在启动文件夹中。我需要在当前用户的桌面目录中创建一个目录。我只知道如何在当前目录中创建一个新目录。
我知道如何制作目录的唯一方法是使用命令mkdir
.
Windows 桌面目录的默认值使用%USERPROFILE%Desktop
定义。USERPROFILE
是预定义的 Windows 环境变量之一。
因此,可以仅使用:
md "%UserProfile%DesktopNewDirectory" 2>nul
只要用户没有更改桌面目录的默认值,这将在用户的桌面上创建一个名称为NewDirectory
的目录。命令md
可以与完全限定的目录路径或相对目录路径一起使用。在命令提示符下运行的帮助输出md /?
说明,如果默认情况下启用了命令扩展,md
会将整个目录树创建到不存在的目录中。另请参阅有关命名文件、路径和命名空间的Microsoft文档。
但是最好从Windows注册表获取桌面目录路径,而不是仅使用默认值。有两个注册表项包含一个字符串值,其名称Desktop
以及用户桌面目录的路径:
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders
此注册表项包含多个通常为REG_EXPAND_SZ
类型的字符串值,这些值定义为当前用户帐户定义的各种 shell 文件夹的路径。shell 文件夹通常包含一个环境变量引用,例如%USERPROFILE%
这是类型REG_EXPAND_SZ
的原因,这意味着必须额外扩展字符串值才能获得 shell 文件夹的绝对路径。下面的批处理文件通过使用命令CALL来扩展环境变量引用,以强制 Windows 命令处理器再进行一次命令行分析。
例如,命令set "DesktopFolder=%%~K"
在执行for
命令set "DesktopFolder=%USERPROFILE%Desktop"
时变为第一个。由于命令call
,在真正执行命令之前,此命令会cmd.exe
再次解析set "DesktopFolder=C:UsersUserNameDesktop"
set
以定义环境变量DesktopFolder
,并使用从Windows注册表读取的实际绝对文件夹名称来定义环境变量。HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders
此注册表项包含与上述注册表项几乎相同的字符串值,但字符串值通常为REG_SZ
类型。此注册表项用于向下兼容不支持其他注册表项的应用程序以及带有环境变量引用的字符串值。
可能仅在两个注册表项之一中定义 shell 文件夹。例如,在 Windows XP 上,字符串值Administrative Tools
、CD Burning
、Fonts
和Recent
仅存在于注册表项Shell Folders
下,而不存在于注册表项User Shell Folders
下。
Compo添加的信息:
默认情况下,Windows 本身使用在键
User Shell Folders
下定义的字符串值,并且仅当键User Shell Folders
下不存在时才使用键Shell Folders
下定义的字符串值。如果用户或程序直接在注册表中修改键
User Shell Folders
下的字符串值,而不对键Shell Folders
下具有相同名称的键进行适当的更改,Windows 不会将对键User Shell Folders
下的字符串值的修改传播到键Shell Folders
下的相同名称的字符串值 .
因此Desktop
,在User Shell Folders
中包含与Desktop
不同的目录路径Shell Folders
、Windows使用User Shell Folders
中用Desktop
定义的路径。
用户可以自由地将任何文件夹更改为用户想要的任何文件夹。但是用户必须注意更改现有两次的两个注册表项中的字符串值。某些 shell 文件夹可以通过 Windows 图形用户界面上的选项或 Windows 应用程序(如Downloads
shell 文件夹)轻松修改。
另请参阅已知文件夹和 KNOWNFOLDERID 的Microsoft文档、这些页面上引用的其他文档页以及有关应用程序注册的文档。
这是一个批处理文件,它从Windows注册表中获取用户的桌面目录尽可能安全。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DesktopFolder="
for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%System32reg.exe QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser 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%System32reg.exe QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell 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
输出的查询结果与Windows Vista和更新的Windows版本reg.exe
不同。
请参阅Microsoft篇关于使用命令重定向运算符的文章,了解2>nul
该将命令MD输出的错误消息重定向到已存在的目录上,以将STDERR处理到设备NUL以禁止显示此错误消息。
但是,用户的桌面目录应仅包含快捷方式文件(*.lnk
文件)以及用户在桌面上创建的文件和目录。除了用户桌面目录中的快捷方式文件之外,任何程序都不应创建其他文件。Microsoft为应用程序定义了其他几个 shell 文件夹,例如应用程序的APPDATA
(应用程序数据)或LOCALAPPDATA
(本地应用程序数据)。
有关处理字符串值的其他事实,这些事实Desktop
在WindowsUser Shell Folders
和Shell Folders
的键下,如Windows XP SP3 x86观察到的那样,在更改当前用户的注册表配置单元后始终重新启动Windows:
值的路径字符串
Desktop
在键User Shell Folders
下,例如从%USERPROFILE%Desktop
更改为%USERPROFILE%MyDesktop
,当然,创建目录%USERPROFILE%MyDesktop
会在下次登录时将Windows桌面目录更改为自定义%USERPROFILE%MyDesktop
,并且Shell Folders
键下的Desktop
字符串值将在下次重新启动时由Windows调整。我没有测试过密钥下的Desktop
Shell Folders
是否也适用于注销和登录。最好同时更改两个Desktop
字符串值,以将桌面目录永久更改为与默认%USERPROFILE%Desktop
不同的目录。Windows 永远不会重新创建键
User Shell Folders
下Desktop
删除或重命名的字符串值。因此,如果键下Desktop
User Shell Folders
错误地删除或重命名,或者注册表文件部分损坏,导致此字符串值不存在,则此字符串值可能不存在。用户不会注意到该问题,如下面的进一步测试所示。如果键
User Shell Folders
下类型为REG_EXPAND_SZ
的字符串值Desktop
根本不存在,则键Shell Folders
下类型为REG_SZ
的字符串值Desktop
始终设置为扩展路径%USERPROFILE%Desktop
。如果此错误处理案例中不存在,Windows 还会自动创建目录%USERPROFILE%Desktop
如果用户或程序删除或重命名了键
Shell Folders
下类型为REG_SZ
的字符串值Desktop
和键User Shell Folders
下类型为REG_EXPAND_SZ
的字符串值Desktop
,则 Windows 将在下次启动键Shell Folders
下创建类型为REG_SZ
的字符串值Desktop
,并扩展路径为%USERPROFILE%Desktop
,并创建目录(如果不存在)。Windows不会重新创建键USer Shell Folders
下类型为REG_EXPAND_SZ
的字符串值Desktop
。如果键
Shell Folders
下类型为REG_SZ
的字符串值Desktop
存在与%USERPROFILE%Desktop
(如%USERPROFILE%MyDesktop
的展开路径)不同的扩展路径,并且键User Shell Folders
下类型为REG_EXPAND_SZ
的字符串值Desktop
根本不退出,Windows 将忽略键Shell Folders
下类型为REG_SZ
的Desktop
的自定义路径,并将值设置为展开路径%USERPROFILE%Desktop
并另外创建目录%USERPROFILE%Desktop
(如果尚不存在)。因此,如果不在键User Shell Folders
下使用类型为REG_EXPAND_SZ
的字符串值Desktop
定义自定义桌面目录,则无法使用自定义桌面目录。
我没有在 Windows 上使用较新版本进行测试,以处理键下的Desktop
Shell Folders
和User Shell Folders
,如果一个或两个字符串值不存在和/或具有相同或不同的目录路径和/或目录路径与默认值不同。
我会提供一种从注册表中检索路径的方法:
@For /F "EOL=HTokens=2*" %%A In ('^""%__AppDir__%Reg.exe" Query^
"HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders"^
/V Desktop^" 2^>NUL')Do @Call MD "%%BNew Directory" 2>NUL
以上旨在在当前用户桌面上创建名为New Directory
的目录(根据需要更改)。