桌面路径的环境变量是什么?

时间:2010-01-04 16:40:04

标签: windows powershell vbscript localization desktop

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

  

%UserProfile%\ Desktop \

但是,我在想,这可能只适用于英语操作系统。有没有办法可以在批处理文件中执行此操作,该文件适用于任何国际化版本?

更新

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

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

18 个答案:

答案 0 :(得分:55)

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

[Environment]::GetFolderPath("Desktop")

使用Powershell复制内容:

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

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

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

答案 1 :(得分:14)

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

这是批处理文件:

@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)

可能还有其他解决方案,但我个人认为这个解决方案不那么苛刻。

我在英语PC和法国电脑上测试了它 - 它似乎可以工作(Windows XP)。

HTH,

IulianŞerbănoiu

答案 2 :(得分:14)

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

但是,如果您在提示符处以交互方式工作,或者只是想要在您的计算机上运行某些内容,则tilda(〜)字符将引用当前用户的主文件夹。所以~/desktop是用户的桌面文件夹。

答案 3 :(得分:14)

至少在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我认为投影操作系统时这是一件坏事。

答案 4 :(得分:6)

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

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%

答案 5 :(得分:4)

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

这将让您了解系统中可用的环境变量。

E.g。 - 因为你特意要求非英语Windows - 继承人就是我自己的德语版(Window7-64bit)的一个例子:

set > env.txt
type env.txt

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\SOF\AppData\Roaming
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

答案 6 :(得分:3)

在Windows 7中,

返回桌面路径:

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% 

答案 7 :(得分:2)

这不是一个解决方案,但我希望它有所帮助:除非当KEY =%userprofile%\ desktop时,即使zdesktop =%userprofile%\ desktop,副本也会失败。我认为因为嵌入的%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

因此它成功地解析了REG键,但如果键包含嵌入的%var%,则在复制命令期间不会翻译它。

答案 8 :(得分:2)

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

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子程序允许延迟扩展环境变量。

答案 9 :(得分:2)

如果您想使用

from PIL import Image
from flask import Flask, render_template
import datetime
app = Flask(__name__)
@app.route("/")
def hello():
    img = Image.new('RGB', (60, 30), color = 'red')
    templateData = {
      'title' : 'HELLO!',
      'image': img
      }
    return render_template('index.html', **templateData)
if __name__ == "__main__":
   app.run(host='0.0.0.0', port=80, debug=True)

可以在<!DOCTYPE html> <head> <title>{{title}}</title> </head> <body> <h1>Hello, World!</h1> <img src="{{image}}" alt="not working"> </body> </html> 中进行操作(感谢Marian Pascalau线程上的MS用户this

[Environment]::GetFolderPath("Desktop")

答案 10 :(得分:2)

虽然我意识到这是一个较旧的帖子,但我认为这可能会帮助处于类似情况的人。我做了一个快速的一行VBScript来提取您想要的任何特殊文件夹的信息(虽然没有错误检查),它的工作原理如下:

使用以下行创建文件“GetShellFolder.vbs”:

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

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

现在将要复制的文件复制到同一文件夹,然后使用以下行创建一个批处理文件:

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

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

哦,对于那些不知道"%~dp0"只是调用脚本的目录的人。它也适用于UNC路径,这使得使用它的批处理文件非常便携。这特别以尾随的“\”结尾,但乍一看它看起来有些奇怪。

答案 11 :(得分:1)

TL;DR

%HOMEDRIVE%%HOMEPATH%\Desktop 似乎是最安全的方法。

讨论

关于一个东西在哪个驱动器上的假设在 Windows 中非常脆弱,因为它缺乏一个统一的目录树,挂载将在内部映射到目录。因此,引用 %HOMEDRIVE% 变量很重要,以确保您选择正确的变量(它并不总是 C:\!)。

非英语语言环境通常会有诸如“桌面”和“图片”之类的本地化名称,但幸运的是它们都是指向 Desktop 的别名,这似乎是底层规范目录名称,无论如何语言环境(我们在日本、泰国、以色列和美国安全地使用它)。

确定 %UserProfile% 是否指向用户的实际个人资料基础目录、他们的桌面或完全不同的地方是一个大怪癖。我不是真正的 Windows 开发人员,但我发现配置文件目录用于设置,但 %HOMEPATH% 用于用户自己的文件,因此它指向导致桌面/下载的目录根目录/图片/等。这往往使 %HOMEDRIVE%%HOMEPATH%\Desktop 成为最安全的方法。

答案 12 :(得分:1)

我使用此代码从注册表中获取用户桌面和公共桌面路径,在Windows XP SP2 pt-PT和Windows 10 b14393 en-US上进行测试,因此它可能适用于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,它是我的SETVARS.CMD的一部分,我从其他批次调用来设置常见变量,如cpu架构,帐户语言,Windows版本和Service Pack,用户/公共桌面的路径等等。

答案 13 :(得分:1)

无论Windows的语言版本是什么,无论文件夹位于何处,都可以使用。文件夹路径中是否有空格也无关紧要。

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

答案 14 :(得分:1)

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

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

答案 15 :(得分:1)

@Dave Webb的回答可能就是要走的路。我唯一能想到的是CSIDLs

  

CSIDL_DESKTOPDIRECTORY

     

用于的文件系统目录   物理存储文件对象   桌面(不应该混淆   与桌面文件夹本身)。一个   典型的路径是C:\ Documents and   Settings \用户名\桌面。

我不知道如何从命令行获取它们。

答案 16 :(得分:0)

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

$env:UserProfile 

要使用它来访问桌面,它将是:

cd $env:UserProfile\desktop

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

答案 17 :(得分:0)

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

我已经稍微修改了tomasz86解决方案,以使用旧样式“ Shell文件夹”而不是“ User Shell文件夹”,因此我不需要扩展envvar%userprofile%

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

import org.json4s.{CustomSerializer, DefaultFormats, NoTypeHints}
import org.json4s.JsonAST.{JField, JInt, JObject}
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.read

object Json4sExercise {

  trait ObjectHolder[T] {
  }

  case class IntValue(v: Int) extends ObjectHolder[Int]

  case class StringValue(v: String) extends ObjectHolder[String]

  class IntSerializer extends CustomSerializer[IntValue](format => ( {
    case JInt(x) => IntValue(x.toInt)
  }, {
    case IntValue(x) => JInt(BigInt(x))
  }
  ))

  implicit val formats =  Serialization.formats(NoTypeHints) + new IntSerializer

  def main(args: Array[String]): Unit = {
    println(read[Map[String, _]](""" {"price":350} """))
  }

}

希望有帮助。