@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"
echo Desktop folder is: "%DesktopFolder%"
endlocal
4条答案
按热度按时间dvtswwa31#
字符串
am46iovg2#
每个用户帐户都有预定义的Windows环境变量。其中一个预定义的环境变量是
USERPROFILE
,包含用户配置文件目录的路径。默认情况下,用户桌面的目录是
%USERPROFILE%\Desktop
,如Windows注册表中HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
项下定义的,值为REG_EXPAND_SZ
的Desktop
。还有一个值为
Desktop
的键HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
,但类型为REG_SZ
,文件夹路径为用户桌面,环境变量引用已展开。用户可以修改任何shell文件夹的文件夹路径,包括桌面文件夹,尽管大多数shell文件夹路径都是默认定义的。
所以一个安全的方法来获取用户的桌面文件夹的路径是:
字符串
如果环境变量
DesktopFolder
偶然存在于批处理文件的本地环境中,则首先删除该环境变量。接下来,默认情况下,查询注册表项
User Shell Folders
的未扩展注册表值Desktop
,如果具有此注册表值的注册表项存在,并且如预期的那样具有非空字符串,将文件夹路径分配给环境变量DesktopFolder
展开。在这种情况下,call
用于在将文件夹路径分配给环境变量之前展开环境变量引用DesktopFolder
通过双重解析长命令行的最后一部分。为了安全起见,还评估了注册表值的类型,尽管此注册表值应始终为REG_EXPAND_SZ
类型。这是非常不可能的,第一个注册表查询是不成功的任何Windows,包括Windows 2000,Windows XP和Windows Server 2003,当然所有较新版本的Windows。但如果第一个注册表查询未能确定用户的桌面文件夹,对键
Shell Folders
下的Desktop
的字符串值进行另一个注册表查询,该键默认为类型REG_SZ
,这意味着注册表值保存已经扩展的目录路径。最后,如果两个注册表查询都意外失败,则使用预定义的环境变量
UserProfile
使用默认文件夹路径定义环境变量DesktopFolder
,以实现近100%的安全性。最后,环境变量
DesktopFolder
保存用户桌面文件夹的文件夹路径,直到命令endlocal
行。确定
Desktop
目录路径的顺序与Windows本身使用的完全相同,如果Desktop
注册表值根本不存在,则错误处理相同,这是非常不可能的,但根据我的测试,在各种测试用例中手动删除一个或两个注册表值,暂时是可能的。为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
for /?
if /?
reg /?
和reg query /?
set /?
setlocal /?
个有关
2>nul
的解释,请阅读Microsoft有关using command redirection operators的文章。在执行命令FOR之前,Windows命令解释器处理FOR命令行时,重定向运算符>
必须使用插入字符^
进行转义,以将其解释为文字字符它使用在后台用%ComSpec% /c
启动的单独命令进程来执行嵌入式reg
命令行,这意味着通常用C:\Windows\System32\cmd.exe /c
。xqnpmsa83#
尝试在输出行中将完整路径指定为:
字符串
qlvxas9a4#
或者使用break:
字符串