【问题标题】:What's the environment variable for the path to the desktop?桌面路径的环境变量是什么?
【发布时间】:2011-01-01 07:41:02
【问题描述】:

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

%UserProfile%\桌面\

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

更新

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

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 文件夹" /v 桌面 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell 文件夹 桌面 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 文件夹 s" /v 桌面`) DO SET 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 开启。

【问题讨论】:

  • @Scott Langham:也许 Powershell(或 VB 脚本)会帮助你
  • 问题在于skip=4 选项。这告诉FOR 命令在处理数据之前要跳过多少标题行。在 XP 上有 4 行,但在我的 Windows 7 系统和您的系统上只有 1 行。所以将 skip=4 更改为 skip=1 应该可以。此外,您只需要脚本中的两个 FOR 命令。不需要第一次调用REG
  • 你测试了吗?据我所知,所有 Windows 7 及更高版本都使用相同的桌面文件夹路径。它只是直观地转换为系统的当前语言。我的系统不是 en-US 并且 %UserProfile%\Desktop\ 运行良好。

标签: windows powershell vbscript localization desktop


【解决方案1】:

为了安全起见,您应该在 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

【讨论】:

【解决方案2】:

我发现最好的解决方案是将 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 和一台法语 PC 上对此进行了测试 - 它似乎可以工作 (Windows XP)。

【讨论】:

    【解决方案3】:

    编辑:使用接受的答案,如果不使用默认位置,这将不起作用,例如:用户将桌面移动到另一个驱动器,如 D:\Desktop


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

    【讨论】:

    • 它不适用于瑞典语版本,因为它在瑞典语中不是 Desktop,而是 Skrivbord。因此,%UserProfile%\Skrivbord 是瑞典语版本的正确用法,%UserProfile%\Desktop 无效。
    • 我将桌面移至 E:\Desktop。这将不起作用。我正在运行 Windows 8.1,但我很确定您也可以在 Windows 7 上执行此操作。请不要这样做,因为这是丢失图标的最常见原因。
    • @Qben,无论语言如何,都会始终使用英文术语。 %UserProfile%\Desktop 将转到 %UserProfile%\Skrivbord
    • 我的桌面文件夹位于E:\Users\YourName\Desktop,但如果您使用%UserProfile%\Desktop,您将到达C:\Users\YourName\Desktop,其中为空。
    • 我很惊讶这没有被标记为选择的答案,因为这是迄今为止 imo 的最佳答案。但是@zxq9,您可能应该使用您提供的解决方案做出自己的回答。
    【解决方案4】:

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

    但是,如果您在提示符下以交互方式工作,或者只是想要在您的计算机上运行的东西,则波浪号 (~) 字符指的是当前用户的主文件夹。所以~/desktop是用户的桌面文件夹。

    【讨论】:

    • 这是对的。 +1 而且我相信桌面将永远是“桌面”
    • 你不能假设 ~/desktop 可以工作,因为它可以被重定向到漫游配置文件。我就是这种情况;)
    • 我喜欢这个作为我的个人资料。 Set-Location $([Environment]::GetFolderPath("Desktop")) 正是我想要的。
    【解决方案5】:

    这不仅不适用于国际版本的 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%
    

    【讨论】:

    • 对我来说,在 Windows 7 上,返回 Desktop REG_EXPAND_SZ %USERPROFILE%\Desktop 是正确的,但可能对他的批处理文件中的 OP 没有帮助,因为他可能无法解析环境变量。还是他只需要使用它,它就会自行解析?
    • 添加了一些代码来解析REG.EXE的输出到答案。
    • 感谢戴夫的提示。不过,我还没有完全到那里——我想我错过了一些东西。我已经更新了问题以显示我必须去哪里。如果您有更多建议,我们将不胜感激。
    • 请记住,不鼓励从注册表中查询。因此,应该使用 Kb 的 VBScript 解决方案来确保其有效。
    【解决方案6】:

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

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

    例如- 因为你特别要求非英语 Windows - 这里是我自己的 德文版 (Window7-64bit) 的示例:

    设置 > env.txt 输入 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 计算机名=VMSOF ComSpec=C:\Windows\system32\cmd.exe FP_NO_HOST_CHECK=否 家庭驱动器=C: HOMEPATH=\用户\SOF LOCALAPPDATA=C:\Users\SOF\AppData\Local 登录服务器=\\VMSOF NUMBER_OF_PROCESSORS=2 操作系统=Windows_NT 路径=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\程序文件 (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 程序数据=C:\程序数据 ProgramFiles=C:\程序文件 程序文件(x86)=C:\程序文件(x86) ProgramW6432=C:\程序文件 提示=$P$G PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ 公共=C:\用户\公共 SESSIONNAME=控制台 系统驱动器=C: SystemRoot=C:\Windows TEMP=C:\Users\SOF\AppData\Local\Temp TMP=C:\Users\SOF\AppData\Local\Temp 用户域=VMSOF 用户名=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 相当无聊,因为微软在 Windows Vista 中准确地引入了文件系统虚拟化以避免像 OP 所面临的问题。 IOW:每个语言版本的 Windows 7 的桌面都会在C:\Users\%USERNAME%\Desktop 中,即使你真的打开资源管理器它会假装住在C:\Benutzer 中(对于德国系统)。
    • 题外话:你怎么能有那个账户名而没有有与该账户关联的图片? :-)
    • 约尔格:这只是对了一半。您可以轻松地将桌面文件夹移动到其他位置。这不会留下一个指向新位置的连接点。此外,用户的个人资料不需要在C:\Users 下。它可以在任何地方;再次,没有路口指向那里。这些只是路径的新默认值以及一些连接点,以使具有硬编码遗留路径的程序保持愉快。好吧,不要在文件系统中使用本地化名称,这在 MUI 环境中确实没有意义。
    • Vokuhila:我非常想知道您在 64 位 Windows 上的哪里找到了 DOS 提示符 :-)。 cmd.exe 不是 DOS。
    【解决方案7】:

    在 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 回声%桌面目录%

    【讨论】:

      【解决方案8】:

      如果你想使用

      [Environment]::GetFolderPath("Desktop")
      

      cmd.exe 中,您可以这样做(感谢this 线程上的MS 用户Marian Pascalau

      set dkey=Desktop
      set dump=powershell.exe -NoLogo -NonInteractive "Write-Host $([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::%dkey%))"
      for /F %%i in ('%dump%') do set dir=%%i
      
      echo Desktop directory is %dir%
      

      【讨论】:

        【解决方案9】:

        这不是一个解决方案,但我希望它有所帮助:这很接近,除了当 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%,则在复制命令期间它不会被翻译。

        【讨论】:

          【解决方案10】:

          我遇到了类似的问题(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 子例程允许延迟扩展环境变量。

          【讨论】:

            【解决方案11】:

            虽然我意识到这是一篇较旧的帖子,但我认为这可能会对处于类似情况的人们有所帮助。我做了一个快速的单行 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>"
            

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

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

            【讨论】:

              【解决方案12】:

              @Dave Webb 的答案可能是要走的路。我唯一能想到的其他东西是CSIDLs

              CSIDL_DESKTOPDIRECTORY

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

              不过,我不知道如何从命令行获取这些内容。

              【讨论】:

                【解决方案13】:

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

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

                【讨论】:

                  【解决方案14】:

                  无论是什么语言版本的 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% 文件夹,因为默认情况下该文件夹不可用。

                  【讨论】:

                    【解决方案15】:

                    我使用此代码从注册表中获取用户桌面和公共桌面路径,在 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 版本和服务包、用户/公共桌面的路径等。

                    【讨论】:

                      【解决方案16】:

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

                      $env:UserProfile 
                      

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

                      cd $env:UserProfile\desktop
                      

                      这可以在 Windows 7 上本地和远程工作。希望这对我遇到客户端机器在 $home 中没有值的情况很有用。

                      【讨论】:

                      • 桌面移动到别的地方就不行了
                      【解决方案17】:

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

                      我稍微修改了 tomasz86 解决方案,以查看旧样式的“Shell Folders”而不是“User Shell Folders”,所以我不需要扩展 envvar %userprofile%

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

                      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%
                      

                      希望对你有帮助。

                      【讨论】:

                        【解决方案18】:

                        TL;DR

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

                        讨论

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

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

                        最大的问题在于确定%UserProfile% 是指向用户的实际配置文件基本目录,还是他们的桌面或完全不同的地方。我不是真正的 Windows 开发人员,但我发现配置文件目录用于设置,但 %HOMEPATH% 用于用户自己的文件,所以它指向指向桌面/下载/图片的目录根/等等。这往往使%HOMEDRIVE%%HOMEPATH%\Desktop 成为最安全的方式。

                        【讨论】:

                          猜你喜欢
                          • 2015-09-30
                          • 2011-08-27
                          • 1970-01-01
                          • 2017-01-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多