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使用
但是,如果您在提示符下进行交互工作,或者只想在计算机上工作,则tilda(?)字符表示当前用户的主文件夹。因此
我发现最好的解决方案是将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上,您可以安全地使用
Windows XP en-US,它将扩展为
Windows XP pt-BR它将扩展为
Windows 7 en-US,它将扩展为
Windows 7 pt-BR它将扩展为
在XP上,您不能将其用于桌面以外的其他文件夹
这不仅不适用于Windows的国际版本,而且如果用户编辑了注册表以使其桌面文件夹位于其他位置,则失败。您可以使用
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),当然还有
哦,对于那些不知道
这不是解决方案,但我希望它能有所帮助:这样做很接近,除了当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值没有的情况。