关于Windows:桌面路径的环境变量是什么?

What's the environment variable for the path to the desktop?

我正在编写Windows批处理文件,并希望将某些内容复制到桌面。 我想我可以用这个:

%UserProfile%\Desktop\

但是,我在想,这可能只会在英语操作系统上起作用。 有没有一种方法可以在任何国际化版本的批处理文件中执行此操作?

更新

我尝试了以下批处理文件:

1
2
3
4
REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /F"usebackq tokens=3 skip=4" %%i in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F"usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

并得到以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
S:\>REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    Desktop    REG_EXPAND_SZ    %USERPROFILE%\Desktop


S:\>FOR /F"usebackq tokens=3 skip=4" %i in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folder
s"
/v Desktop`) DO SET DESKTOPDIR=%i

S:\>FOR /F"usebackq delims=" %i in (`ECHO ECHO is on.`) DO SET DESKTOPDIR=%i

S:\>SET DESKTOPDIR=ECHO is on.

S:\>ECHO ECHO is on.
ECHO is on.


为了安全起见,您应该在Powershell(或VBScript)中使用正确的API。
使用PowerShell:

1
[Environment]::GetFolderPath("Desktop")

使用Powershell复制内容:

1
Copy-Item $home\*.txt ([Environment]::GetFolderPath("Desktop"))

这是获取桌面路径的VBScript示例:

1
2
3
4
5
6
dim WSHShell, desktop, pathstring, objFSO
set objFSO=CreateObject("Scripting.FileSystemObject")
Set WSHshell = CreateObject("WScript.Shell")
desktop = WSHShell.SpecialFolders("Desktop")
pathstring = objFSO.GetAbsolutePathName(desktop)
WScript.Echo pathstring


KB使用[Environment]::GetFolderPath("Desktop")的答案显然是执行此操作的官方Windows API。

但是,如果您在提示符下进行交互工作,或者只想在计算机上工作,则tilda(?)字符表示当前用户的主文件夹。因此~/desktop是用户的桌面文件夹。


我发现最好的解决方案是将vbscript与批处理文件一起使用。

这是批处理文件:

1
2
3
@ECHO OFF
FOR /F"usebackq delims=" %%i in (`cscript findDesktop.vbs`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

这是findDesktop.vbs文件:

1
2
3
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
wscript.echo(strDesktop)

可能还有其他解决方案,但我个人认为这种解决方法不太可靠。

我在英语PC和法语PC上都进行了测试-似乎可以工作(Windows XP)。

HTH,

尤利安·埃尔布·诺乌


至少在Windows XP,Vista和7上,您可以安全地使用"%UserProfile%\Desktop"

Windows XP en-US,它将扩展为"C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR它将扩展为"C:\Documents and Settings\YourName\Desktop"
Windows 7 en-US,它将扩展为"C:\Users\YourName\Desktop"
Windows 7 pt-BR它将扩展为"C:\Usuarios\YourName\Desktop"

在XP上,您不能将其用于桌面以外的其他文件夹
My documents转向Meus DocumentosLocal Settings转向Configuracoes locais Personaly我认为投影OS时这是一件坏事。


这不仅不适用于Windows的国际版本,而且如果用户编辑了注册表以使其桌面文件夹位于其他位置,则失败。您可以使用REG命令在注册表中查询文件位置:

1
REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop

要将其转化为变量,请使用以下代码:

1
2
3
FOR /F"usebackq tokens=3 skip=4" %%i in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F"usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%


您还可以打开DOS命令提示符并执行set命令。

这将使您了解系统上可用的环境变量。

例如。 -由于您专门要求使用非英语Windows-这是我自己的德语版(Window7-64bit)的一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
set > env.txt
type env.txt

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\SOF\AppData
oaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=VMSOF
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\SOF
LOCALAPPDATA=C:\Users\SOF\AppData\Local
LOGONSERVER=\\VMSOF
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\CMake 2.8\bin;C:\Program Files (x86)\emacs-22.3\bin;C:\Program Files (x86)\GnuWin32\bin;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=AMD64 Family 15 Model 67 Stepping 3, AuthenticAMD
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=4303
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\SOF\AppData\Local\Temp
TMP=C:\Users\SOF\AppData\Local\Temp
USERDOMAIN=VMSOF
USERNAME=SOF
USERPROFILE=C:\Users\SOF
VBOX_INSTALL_PATH=C:\Program Files\Sun\VirtualBox\
VS90COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
windir=C:\Windows


在Windows 7中,这将返回桌面路径:

1
2
3
FOR /F"usebackq tokens=3" %%i in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F"usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

虽然我意识到这是一篇较旧的文章,但我认为这可能会对处于类似情况的人们有所帮助。我快速编写了一行VBScript以提取您想要的任何特殊文件夹的信息(尽管没有错误检查),并且它的工作方式如下:

用以下行创建文件" GetShellFolder.vbs":

1
WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders(WScript.Arguments(0))

我始终确保将cscript.exe(32位版本)复制到与我正在运行的批处理文件所在的文件夹相同的文件夹中,我将假设您正在执行相同的操作(我曾经遇到过用户以某种方式删除C: Windows system32从它们的路径,或设法摆脱了cscript.exe,或者它已被感染或无法正常运行)。

现在,将要复制的文件复制到同一文件夹,并在其中创建带有以下行的批处理文件:

1
2
for /f"delims=" %%i in ('^""%~dp0cscript.exe""%~dp0GetShellFolder.vbs""Desktop" //nologo^"') DO SET SHELLDIR=%%i
copy /y"%~dp0<file_to_copy>""%SHELLDIR%\<file_to_copy>"

在上面的代码中,您可以将" Desktop"替换为任何有效的特殊文件夹(" Favorites"," StartMenu"等)-完整的官方列表位于https://msdn.microsoft.com/zh-cn/library/0ea7b5xe%28v=vs .84%29.aspx),当然还有以及要放置的实际文件。这使您不必尝试访问注册表(无论如何您都不能以受限用户身份进行访问),并且应该足够简单以适应多个应用程序。

哦,对于那些不知道"%~dp0"的目录,只是从中调用脚本的目录。它也适用于UNC路径,这使得使用它的批处理文件具有极高的可移植性。但这特别以结尾的""结尾,因此乍看之下看起来有些奇怪。


这不是解决方案,但我希望它能有所帮助:这样做很接近,除了当KEY =%userprofile% desktop时,即使zdesktop =%userprofile% desktop也会复制失败。我认为是因为嵌入的%userprofile%没有得到翻译。

1
2
3
4
5
REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop>z.out
for /f"tokens=3 skip=4" %%t in (z.out) do set zdesktop=%%t
copy myicon %zdesktop%
set zdesktop=
del z.out

因此,它可以成功解析出REG密钥,但是如果该密钥包含嵌入式%var%,则在复制命令期间不会进行转换。


我遇到了类似的问题(并且不能使用VBScript或PowerShell),并且本文中找到的代码对我不起作用。我在操作系统版本和语言版本方面遇到问题。经过一些实验,我得出了以下解决方案:

1
2
3
4
5
6
7
for /f"usebackq tokens=2,3*" %%A in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v"Desktop"`) do if %%A==REG_EXPAND_SZ call :reparse set desktopdir=%%B
echo %desktopdir%
goto :EOF

:reparse
%*
goto :EOF

该代码适用于Windows 7和Windows XP的英语和波兰语版本。

:reparse子例程允许延迟扩展环境变量。


多语言版本,已在日语操作系统上测试
批处理文件

1
2
3
4
5
6
7
set getdesk=REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop<br />
FOR /f"delims=(=" %%G IN ('%getdesk% ^|find"_SZ"') DO set desktop=%%G<br />
set desktop1=%desktop:*USERPROFILE%\=%<br />
cd"%userprofile%\%desktop1%"<br />
set getdesk=<br />
set desktop1=<br />
set desktop=<br />


无论它是Windows的哪种语言版本,以及无论该文件夹位于何处,它都应该起作用。文件夹路径中是否有空格也没有关系。

1
2
FOR /F"tokens=2*" %%A IN ('REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I"desktop"') DO SET Desktop=%%B
ECHO %Desktop%

如果是Windows 2000(可能是NT 4.0),则需要将reg.exe手动复制到%windir%文件夹,因为默认情况下该文件夹不可用。


我使用此代码从注册表中获取了用户桌面和公用桌面路径,并在Windows XP SP2 pt-PT和Windows 10 b14393 zh-CN上进行了测试,因此它可能适用于Vista / 7/8和其他语言。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
:: get user desktop and public desktop paths
for /f"tokens=* delims=" %%a in ('reg query"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop ^|find /i"REG_"') do set"batch_userdesktop=%%a"
for /f"tokens=* delims=" %%a in ('reg query"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v"Common Desktop" ^|find /i"REG_"') do set"batch_publicdesktop=%%a"

:: remove everything up to and including"_SZ"
set"batch_userdesktop=%batch_userdesktop:*_sz=%"
set"batch_publicdesktop=%batch_publicdesktop:*_sz=%%

:: remove leading spaces and TABs
:loop
if"
%batch_userdesktop:~0,1%"=="" set"batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if"
%batch_publicdesktop:~0,1%"=="" set"batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop
if"
%batch_userdesktop:~0,1%"=="   " set"batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if"
%batch_publicdesktop:~0,1%"==" " set"batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop

最后两行在""中包含一个TAB,某些文本编辑器在您按下TAB时会添加空格,因此请确保您有一个实际的TAB而不是空格。

我不确定代码是否需要setlocal enabledelayedexpansion,它是我的SETVARS.CMD的一部分,我从其他批次调用它来设置公共变量,例如cpu体系结构,帐户语言,Windows版本和Service Pack,用户/公共桌面的路径等。


@Dave Webb的答案可能是解决方法。我唯一想到的是CSIDL:

CSIDL_DESKTOPDIRECTORY

The file system directory used to
physically store file objects on the
desktop (which should not be confused
with the desktop folder itself). A
typical path is C:\Documents and
Settings\username\Desktop.

不过,我不知道如何从命令行中获取这些信息。


相当古老的话题。但是我想给我2美分...

我已经对tomasz86解决方案进行了少许修改,以使用旧样式" Shell文件夹"而不是" User Shell文件夹",所以我不需要扩展envvar%userprofile%

也没有来自powershell / vbscript / etc的依赖关系...

1
2
for /f"usebackq tokens=2,3*" %%A in (`REG QUERY"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v"Desktop"`) do if %%A==REG_SZ  set desktopdir=%%B
echo %desktopdir%

希望能帮助到你。


我知道这是一个老话题,但是我会使用Powershell变量

1
$env:UserProfile

要使用它进入桌面,它是:

1
cd $env:UserProfile\desktop

它可以在Windows 7上本地和远程运行。希望这对我很有用,因为我遇到了客户端计算机的$ home值没有的情况。