什么是桌面path的环境variables?

我正在写一个Windowsbatch file,并希望将一些东西复制到桌面上。 我想我可以使用这个:

%USERPROFILE%\桌面\

但是,我在想,这可能只适用于英文操作系统。 有没有一种方法可以在batch file中执行此操作,该文件将适用于任何国际化版本?

UPDATE

我试过下面的batch file:

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% 

得到这个输出:

 S:\> REG QUERY“HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell Folders”/ v桌面

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


 S:\> FOR / F“usebackq tokens = 3 skip = 4”%i in(`REG QUERY“HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell Folder
 s“/ v桌面”)设置DESKTOPDIR =%i

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

 S:\> SET DESKTOPDIR = ECHO打开。

 S:\> ECHO ECHO开启。
 ECHO开启。

我发现最好的解决scheme是将vbscript与batch file一起使用。

这是batch file:

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

这里是findDesktop.vbs文件:

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

可能还有其他的解决办法,但是我个人觉得这个less一些。

我在一台英文的个人电脑和一台法国的个人电脑上testing了这个function – 它似乎可以工作(Windows XP)。

HTH,

IulianŞerbănoiu

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

 [Environment]::GetFolderPath("Desktop") 

使用Powershell复制一些内容:

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

这是一个VBScript的例子来获取桌面path:

 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是用户的桌面文件夹。

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

Windows XP的美国它将扩大到"C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR将展开到"C:\Documents and Settings\YourName\Desktop"
Windows 7的美国它将扩大到"C:\Users\YourName\Desktop"
Windows 7 pt-BR将展开为"C:\Usuarios\YourName\Desktop"

在XP上,您不能将其用于其他文件夹免除桌面My documents转向Meus DocumentosLocal Settings Configuracoes locais Personaly我认为这是一个坏的事情时,投影操作系统。

这不仅对于国际版本的Windows不起作用,而且如果用户编辑了registry以使他们的桌面文件夹驻留在其他地方,它将会失败。 您可以使用REG命令查询registry以获取文件位置:

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

为了得到这个variables使用这样的东西:

 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命令。

这会给你一个想法,你的系统上有什么环境variables可用。

例如 – 因为你在哪里特别要求一个非英语的Windows – inheritance人是我自己的德语版(Window7-64bit)的一个例子:

 set> env.txt
键入env.txt

 ALLUSERSPROFILE = C:\ ProgramData
 APPDATA = C:\用户\ SOF \应用程序数据\漫游
 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:\用户\ SOF \应用程序数据\本地
 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系列15型号67步进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 \模块\
 PUBLIC = C:\用户\公用
 SESSIONNAME =控制台
系统驱动= C:
 SYSTEMROOT = C:\ WINDOWS
 TEMP = C:\ Users \用户SOF \应用程序数据\本地\温度
 TMP = C:\用户\ SOF \应用程序数据\本地\温度
 USERDOMAIN = VMSOF
 USERNAME = SOF
 USERPROFILE = C:\用户\ 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中,这将返回桌面path:

 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 =”%%我在(`ECHO%DESKTOPDIR%`)DO SET DESKTOPDIR = %% i 
 ECHO%DESKTOPDIR% 

这不是一个解决scheme,但我希望它可以帮助:除非当KEY =%userprofile%\ desktop时副本失败,即使zdesktop =%userprofile%\ desktop。 我认为是因为embedded的%userprofile%没有被翻译。

 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 

所以它成功地parsing出REG键,但是如果键包含embedded的%var%,在复制命令期间不会被转换。

我有一个类似的问题(和VBScript或PowerShell不是一个选项),我在这篇文章中find的代码不适合我。 我遇到操作系统版本和语言版本的问题。 经过一些实验,我已经来到这个解决scheme:

 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的英语和波兰语版本。

parsing子程序允许延迟扩展环境variables。

虽然我意识到这是一个较旧的post,我认为这可能会帮助人们在类似的情况。 我做了一个快速的一行VBScript来拉你喜欢的任何特殊文件夹的信息(虽然没有错误检查),它的工作原理是这样的:

使用以下行创build一个文件“GetShellFolder.vbs”:

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

我总是确保将cscript.exe(32位版本)复制到batch file所在的同一文件夹中,我假定你正在做同样的事情(我曾经遇到过用户不知何故删除了C:\ Windows \ system32从他们的path,或设法摆脱cscript.exe,或它的感染或否则不工作)。

现在将要复制的文件复制到相同的文件夹,并使用以下几行创build一个batch file:

 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>" 

在上面的代码中,您可以用任何有效的特殊文件夹(collections夹,StartMenu等等)replace“桌面” – 完整的官方列表在https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs .84%29.aspx ),当然还有<file_to_copy>与你想放在那里的实际文件。 这样可以避免您尝试访问registry(无论如何您都不能作为受限用户),并且应该足够简单,以适应多个应用程序。

呵呵,对于那些不知道"%~dp0"只是脚本被调用的目录而言。 它也适用于UNCpath,这使batch file使用它非常便携。 特别是在尾部的“\”结尾,尽pipe如此,第一眼看起来有点奇怪。

戴维·韦伯的答案可能是要走的路。 我唯一能想到的其他事情就是CSIDL :

CSIDL_DESKTOPDIRECTORY

用于在桌面上物理存储文件对象的文件系统目录(不应与桌面文件夹本身混淆)。 一个典型的path是C:\ Documents and Settings \ username \ Desktop。

不过,我不知道如何从命令行抓住这些。

多语言版本,在日本操作系统上testing
batch file

 set getdesk = REG QUERY“HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell Folders”/ v桌面 
FOR / f“delims =(=”%% G IN('%getdesk%^ | find“_SZ”')DO set desktop = %% G
设置desktop1 =%桌面:* USERPROFILE%\ =%
cd“%userprofile%\%desktop1%”
设置getdesk =
设置desktop1 =
设置桌面=

这应该工作,无论是哪种语言版本的Windows,无论文件夹位于何处。 文件夹path中是否有空格也没有关系。

 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%文件夹,因为默认情况下它不可用。

我使用此代码从registry中获取用户桌面和公用桌面path,在Windows XP SP2 pt-PT和Windows 10 b14393 en-US上进行了testing,因此可能适用于Vista / 7/8和其他语言。

 :: 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,它是我从其他批次调用的设置公共variables(如CPU架构,帐户语言,Windows版本和服务包,用户/公共桌面path等)的SETVARS.CMD的一部分。

我知道这是一个古老的话题,但我会使用Powershellvariables

 $env:UserProfile 

要使用它来到桌面,这将是:

 cd $env:UserProfile\desktop 

这可以在Windows 7本地和远程工作。希望这是有用的,因为我遇到了一个客户端机器没有在$ home的价值的情况。