web-dev-qa-db-fra.com

Quelle est la variable d'environnement pour le chemin d'accès au bureau?

J'écris un fichier de commandes Windows et je veux copier quelque chose sur le bureau. Je pense que je peux utiliser ceci:

% UserProfile%\Desktop \ 

Cependant, je pense que cela ne fonctionnera probablement que sur un système d’exploitation anglais. Est-il possible de le faire dans un fichier batch qui fonctionne sur n'importe quelle version internationalisée?

METTRE À JOUR

J'ai essayé le fichier batch suivant:

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%

Et j'ai eu cette sortie:

 S: \> REG QUERY "Dossiers du shell HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User \"/v Bureau 

 Dossiers du shell HKEY_CURRENT_USER\Software\Microsoft\Windows\Current\Current\
 Bureau REG_EXPAND_SZ% USERPROFILE%\Desktop 


 S: \> FOR/F "usebackq tokens = 3 skip = 4"% i in (`REG QUERY" HKCU\Logiciel\Microsoft\Windows\CurrentVersion\Explorateur\Dossier shell utilisateur 
 S "/ v Desktop`) DO SET SET DESKTOPDIR =% i 

 S: \> FOR/F" usebackq delims = "% i in (` ECHO ECHO est activé). ) DO SET SET DESKTOPDIR =% i 

 S: \> SET DESKTOPDIR = ECHO est activé .

 S: \> ECHO ECHO est activé .
 ECHO est activé .
55
Scott Langham

J'ai trouvé que la meilleure solution consiste à utiliser un vbscript avec le fichier de commandes.

Voici le fichier batch:

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

Voici le fichier findDesktop.vbs:

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

Il y a peut-être d'autres solutions, mais personnellement, je trouve celle-ci moins compliquée.

J'ai testé cela sur un PC anglais et aussi sur un PC français - cela semble fonctionner (Windows XP).

HTH,

Iulian Şerbănoiu

14
INS

Pour plus de sécurité, vous devez utiliser les API appropriées dans Powershell (ou VBScript).
Utilisation de PowerShell:

[Environment]::GetFolderPath("Desktop")

Copier quelque chose en utilisant Powershell:

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

Voici un exemple VBScript pour obtenir le chemin du bureau:

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

La réponse de KB à utiliser [Environment]::GetFolderPath("Desktop") est évidemment l'API Windows officielle pour le faire.

Toutefois, si vous travaillez de manière interactive à l'invite, ou souhaitez simplement quelque chose qui fonctionne sur votre machine, le caractère tilda (~) fait référence au dossier de départ de l'utilisateur actuel. Donc ~/desktop est le dossier du bureau de l'utilisateur.

14
Saqib

Au moins sur Windows XP, Vista et 7, vous pouvez utiliser le "%UserProfile%\Desktop" en toute sécurité.

Windows XP en-US, il passera à "C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR il passera à "C:\Documents and Settings\YourName\Desktop"
Windows 7 en-US, il passera à "C:\Users\YourName\Desktop"
Windows 7 pt-BR il passera à "C:\Usuarios\YourName\Desktop"

Sous XP, vous ne pouvez pas utiliser cette option avec d'autres dossiers, à l'exception de Desktop My documents en passant à Meus Documentos et Local Settings à Configuracoes locais Personnellement, j'estime que c'est une mauvaise chose lorsque vous projetez un système d'exploitation.

14
Vitim.us

Non seulement cela ne fonctionnerait pas pour une version internationale de Windows, mais cela échouerait si l'utilisateur modifiait le registre pour que son dossier Desktop réside ailleurs. Vous pouvez interroger le registre sur l'emplacement du fichier à l'aide de la commande REG:

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

Pour obtenir cela dans une variable, utilisez quelque chose comme ceci:

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%
6
Dave Webb

vous pouvez également ouvrir une invite de commande DOS et exécuter la commande set .

Cela vous donnera une idée des variables d'environnement disponibles sur votre système.

Par exemple. - puisque vous demandiez spécifiquement une version non anglaise de Windows - voici un exemple de ma propre German Edition (Window7-64bit) :

 set> env.txt 
 type env.txt 

 ALLUSERSPROFILE = C:\ProgramData 
 APPDATA = C:\Utilisateurs\SOF\AppData\Roaming 
 CommonProgramFiles = C:\Fichiers de programme\Fichiers communs 
 CommonProgramFiles (x86) = C:\Fichiers de programme (x86)\Fichiers communs 
 CommonProgramW6432 = C:\Fichiers de programme\Fichiers communs 
 COMPUTERNAME = VMSOF 
 ComSpec = C:\Windows\system32\cmd.exe 
 FP_NO_Host_CHECK = NO 
 HOMEDRIVE = C: 
 HOMEPATH =\Users\SOF 
 LOCALAPPDATA = C:\Utilisateurs\SOF\AppData\Local 
 LOGONSERVER = \\ VMSOF 
 NUMBER_OF_PROCESSORS = 2 
 OS = Windows_NT 
 Chemin = C:\Windows\system32; C:\Windows; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0 \; C:\Programmes\TortoiseSVN\bin; C:\Fichiers de programme (x86)\CMake 2.8\bin; C:\Fichiers de programme (x86)\emacs-22.3\bin; C:\Fichiers de programme ( x86)\GnuWin32\bin; 
 PATHEXT = .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .SWF; .WSH; .MSC 
 PROCESSOR_ARCHITECTURE = AMD64 
 PROCESSOR_IDENTIFIER = Famille AMD64 15 Modèle 67, Etape 3, AuthenticAMD 
 PROCESSOR_LEVEL = 15 
 PROCESSOR_REVISION = 4303 
 ProgramData = C :\ProgramData 
 ProgramFiles = C:\Fichiers de programme 
 ProgramFiles (x86) = C:\Fichiers de programme (x86) 
 ProgramW6432 = C:\Fichiers de programme 
 Invite = $ P $ G 
PSModulePath = C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
 PUBLIC = C:\Utilisateurs\Public 
 SESSIONNAME = Console 
 SystemDrive = C: 
 SystemRoot = C:\Windows 
 TEMP = C:\Utilisateurs\SOF\AppData\Local\Temp 
 TMP = C:\Utilisateurs\SOF\AppData\Local\Temp 
 USERDOMAIN = VMSOF 
 USERNAME = SOF 
 USERPROFILE = C:\Utilisateurs\SOF 
 VBOX_INSTALL_PATH = C:\Fichiers de programme\Sun\VirtualBox\
 VS90COMNTOOLS = C:\Fichiers de programme (x86)\Microsoft Visual Studio 9.0\Common7\Outils\
 Windir = C:\Windows 

4
anon

dans Windows 7, cela retourne le chemin du bureau:

 FOR/F "usebackq tokens = 3" %% i in (`REG QUERY" HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Dossiers de shell utilisateur "/ v Desktop`) DO SET SET DESKTOPDIR = %% i
 FOR/F "usebackq delims =" %% i in (`ECHO% DESKTOPDIR%`) DOIT REGLER DESKTOPDIR = %% i 
 ECHO% DESKTOPDIR% 
3
Osama Rajab

Bien que je sache qu'il s'agit d'un article un peu plus ancien, j'ai pensé que cela pourrait aider les personnes dans une situation similaire. J'ai créé un VBScript d'une ligne rapide pour extraire des informations sur le dossier spécial de votre choix (sans vérification d'erreur) et cela fonctionne comme suit:

Créez un fichier "GetShellFolder.vbs" avec la ligne suivante:

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

Je m'assure toujours de copier cscript.exe (version 32 bits) dans le même dossier que le fichier de commandes à partir duquel je lance le traitement, je supposerai que vous procédez de la même manière (des cas dans lesquels des utilisateurs ont en quelque sorte supprimé C:\Windows\system32 de leur chemin, ou réussi à se débarrasser de cscript.exe, ou il est infecté ou ne fonctionne pas autrement).

Maintenant, copiez le fichier à copier dans le même dossier et créez un fichier de commandes avec les lignes suivantes:

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

Dans le code ci-dessus, vous pouvez remplacer "Bureau" par n’importe quel dossier spécial valide (Favoris, Menu Démarrer, etc. - la liste officielle complète est accessible à https://msdn.Microsoft.com/en-us/library/0ea7b5xe%28v = vs.84% 29.aspx ) et bien sûr <file_to_copy> avec le fichier que vous voulez y placer. Cela vous évite d'essayer d'accéder au registre (ce que vous ne pouvez pas faire en tant qu'utilisateur limité de toute façon) et devrait être assez simple pour s'adapter à plusieurs applications.

Oh, et pour ceux qui ne connaissent pas, le "%~dp0" est simplement le répertoire à partir duquel le script est appelé. Cela fonctionne aussi pour les chemins UNC, ce qui rend le fichier batch l’utilisant extrêmement portable. Cela se termine spécifiquement par un "\" de fin, bien que cela puisse paraître un peu étrange au premier regard.

2
Improv

Ce n'est pas une solution, mais j'espère que cela aidera: Cela se rapproche sauf que lorsque la clé =% userprofile%\desktop, la copie échoue même si zdesktop =% userprofile%\desktop. Je pense que parce que le% userprofile% incorporé n'est pas traduit.

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

Donc, il analyse avec succès la clé REG, mais si la clé contient un% var% incorporé, elle ne sera pas traduite lors de la commande de copie.

2
fupsduck

J'ai eu un problème similaire (et VBScript ou PowerShell n'était pas une option) et le code trouvé dans cet article ne fonctionnait pas pour moi. J'ai eu des problèmes avec les versions de système d'exploitation et les versions linguistiques. Après quelques expériences je suis venu à cette solution:

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

Ce code fonctionne pour moi dans les versions anglaise et polonaise de Windows 7 et Windows XP.

Le sous-programme: reparse permet une expansion retardée des variables d'environnement.

2
MBu

J'utilise ce code pour obtenir les chemins d'accès des postes de travail utilisateur et public à partir du registre, testés sous Windows XP SP2 pt-PT et Windows 10 b14393 en-US, de sorte qu'il fonctionne probablement sous Vista/7/8 et dans d'autres langues. .

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

Les deux dernières lignes incluent une tabulation à l'intérieur du "", certains éditeurs de texte ajoutant des espaces lorsque vous appuyez sur la tabulation, assurez-vous de disposer d'une tabulation réelle au lieu d'espaces.

Je ne suis pas sûr que le code nécessite setlocal enabledelayedexpansion, cela fait partie de mon SETVARS.CMD que j'appelle depuis d'autres lots pour définir des variables communes telles que l'architecture du processeur, la langue du compte, la version de Windows et le service pack, le chemin d'accès au bureau utilisateur/public, etc.

1
Johnye

La réponse de @Dave Webb est probablement la solution. La seule autre chose à laquelle je peux penser, ce sont les CSIDLs :

CSIDL_DESKTOPDIRECTORY 

Le répertoire du système de fichiers utilisé pour stocker physiquement les objets de fichier sur le bureau (à ne pas confondre avec le dossier du bureau lui-même). UNE Le chemin typique est C:\Documents et Paramètres\nom d'utilisateur\Bureau.

Je ne sais pas comment obtenir ces informations depuis la ligne de commande.

1
Pekka 웃

Cela devrait fonctionner quelle que soit la version linguistique de Windows et l'emplacement du dossier. De plus, peu importe s'il y a des espaces dans le chemin du dossier.

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%

Dans le cas de Windows 2000 (et probablement de NT 4.0), vous devez copier manuellement reg.exe dans le dossier% windir% car celui-ci n’est pas disponible par défaut.

1
tomasz86

Version multilingue, testée sur un système d'exploitation japonais
Fichier batch

 set getdesk = REG QUERY "Dossiers Shell HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User \"/v Bureau
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 =
1
Josh

Je sais que c'est un peu un sujet ancien, mais j'utiliserais la variable Powershell 

$env:UserProfile 

Pour l'utiliser pour accéder au bureau, ce serait:

cd $env:UserProfile\desktop

Cela fonctionne à la fois localement et à distance sur Windows 7. J'espère que cela sera utile car j'ai rencontré une situation dans laquelle un ordinateur client n'avait pas de valeur dans $ home.

0
Gearhead351