什么是桌面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 Documentos
和Local 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的价值的情况。