17

我正在做一个简单的批处理文件,将位于批处理文件同一路径下的文件夹和文件复制到桌面。我可以使用轻松获取批处理文件所在的路径

%~dp0

但我想知道如何获取用户桌面的路径(我使用的是 Widows 7 Ultimate)

有什么建议么?

4

9 回答 9

80

我想你是在windows环境下,所以%USERPROFILE%\Desktop应该没问题

于 2013-09-05T07:19:56.247 回答
23

这是当前用户桌面的位置:

%userprofile%\desktop
于 2013-09-05T07:44:21.207 回答
21

如果桌面位置在不同的文件夹中,这将是正确的答案:

批处理字符串:

for /f "usebackq tokens=3*" %%D IN (`reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) do set DESKTOP=%%D

V2(使用空格)4.10.2016:

for /f "usebackq tokens=1,2,*" %%B IN (`reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) do set DESKTOP=%%D

如果您有非 ASCII 符号,您还需要将 ANSI 编码转换为 OEM,例如西里尔文:

CHCP 1251 >Nul
for /f "usebackq tokens=1,2,*" %%B IN (`reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) do set DESKTOP=%%D
CHCP 866 >Nul
for /f "delims=" %%i IN ('echo %DESKTOP%') do set DESKTOP=%%i

然后只需使用:

echo %DESKTOP%
于 2016-01-10T13:51:56.620 回答
3

我找到了答案

Regedit /e /a dd.txt       

"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

find /i  dd.txt  "Desktop" >d.txt
For /F  "tokens=2 delims==" %%a in (d.txt) do set mydesktop=%%a
于 2013-09-05T07:15:19.957 回答
2

我也觉得这个应该还可以

%systemdrive%\Documents and Settings\All Users\Desktop

问候

于 2013-09-05T07:33:22.260 回答
1

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

因此,可以仅使用以下文件夹路径:

"%UserProfile%\Desktop"

但最好从 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"

echo User's desktop folder is: %DesktopFolder%

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一个或两个字符串值是否不存在和/或具有相同或不同的目录路径和/或具有与默认值不同的目录路径进行测试。

于 2021-10-17T08:07:57.600 回答
1

仅适用于桌面的最干净的解决方案:

for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%b

echo %DESKTOP%

tokens=Type (2),然后是剩余的 Data (*),因此位置空白未被标记化。(允许空格)


但是,如果您正在寻找任何可能不存在的注册表值:

@echo off

set SUBKEY=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set VALUE_NAME=Desktop

for /f "tokens=*" %%a in ('reg query "%SUBKEY%" /v "%VALUE_NAME%" 2^>nul') do set LINE=%%a

if defined LINE goto else
    echo "%VALUE_NAME%" value not found.
    goto end
:else
    for /f "tokens=2,3 delims=#" %%a in ("%LINE:    =#%") do (
        echo Key: %SUBKEY%
        echo Name: %VALUE_NAME%
        echo Type: %%a
        echo Data: %%b
    )
:end

echo[
pause

tokens=*获取由 4 个空格分隔的整行(名称 + 类型 + 数据)

%LINE: =#%用主题标签替换 4 个空格,以便我们可以正确区分标记

tokens=2,3为我们提供类型和数据字段,它们被放入%%a%%b

如果你只想要你可以做的数据tokens=3,它会在%%a. (因为它是唯一的令牌)

在我在网上查看的所有示例中,我还没有看到其他人收集整行并交换 4 个空格以便他们可以正确标记。他们都让它在每个空格处拆分,这些空格可以存在于 Name 和 Data 字段中。当然,如果您只是在某个特定值之后(例如“Desktop”),您知道 Type 将是第二个标记,而剩余的 Data (*) 是最后一个标记。如果你想要一个“我的图片”的衬里,你会这样做token=3*。(“我的”“图片”“类型”(3)“数据”(*))

此外,2^>nul简单地阻止 reg 查询命令告诉我们该值是否不存在。

于 2022-01-04T02:28:40.437 回答
0

我建议使用这个脚本:

@echo off
if exist "%userprofile%\OneDrive\Desktop" (chdir %userprofile%\OneDrive\Desktop) else (chdir %userprofile%\Desktop)

如果有人在 Windows 安装程序上安装了 OneDrive,他们的桌面可能位于 OneDrive 文件夹下。否则它将是用户\桌面。

于 2022-01-04T08:03:07.717 回答
-1

环境(“用户配置文件”)和“\桌面”

于 2016-06-06T18:06:13.197 回答