web-dev-qa-db-fra.com

Existe-t-il une variable d'environnement défini par le système pour le répertoire de documents?

Je connais la variable d'environnement définie par le système %USERPROFILE% sous Windows XP (ainsi que Vista et Windows 7). Existe-t-il une variable d'environnement définie par le système qui pointe vers l'emplacement du répertoire "Mes documents"? Sur XP par défaut, il s'agit de %USERPROFILE%\My Documents et sur Windows 7, de %USERPROFILE%\Documents. Je voulais juste éviter de devoir tester la version du système d'exploitation dans un script Powershell si je pouvais l'éviter.

55
Onorio Catenacci

Sur mon système XP d'installation par défaut, il n'y a pas de variable d'environnement pour cela. Vous pouvez lister toutes les variables avec la commande "set" (sans paramètre) dans la ligne de commande. Donc, vous devez probablement faire un test.

Si vous ne souhaitez pas tester la version du système d'exploitation, vous pouvez simplement vérifier si "Documents" existe et sinon, essayez "Mes documents" ou inversement. Cela n’est cependant pas parfait, car l’opérateur peut avoir un dossier "Documents" sur sa machine XP. 

Btw: mon système est allemand, donc le dossier s'appelle "Dokumente". Vous devrez peut-être en tenir compte.

Le chemin d'accès à ce dossier est stocké dans

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

sous Personal. Vous avez cependant besoin d'un accès au registre.

Source: Microsoft

30
msteiger

Pour PowerShell les travaux suivants:

[environment]::getfolderpath("mydocuments")

et éviter les chaînes magiques

[Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)

Pour .NET, ce qui suit est vrai (c'est-à-dire que cela ne s'applique pas aux applications toutes Windows):

Comme l’a souligné une réponse, il n’existe pas de variable d’environnement pointant vers Mes documents, mais il existe Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) (C #) pour .NET. 

J'ajoute cette réponse car cette question est posée lorsque vous recherchez Google, des variables d'environnement et mes documents, la réponse de Justin ne contient pas la ligne de code la

L'utilisation de la ligne de code mentionnée ci-dessus est le moyen préféré d'accéder à mes documents dans .NET :)

Copier coller cette ligne pour une utilisation en C #:

var directoryNameOfMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Notez que C # a besoin d'un D majuscule dans MyDocuments.

29
flindeberg

Il n'y a pas de variable d'environnement intégrée, mais dans PowerShell, vous pouvez trouver l'emplacement avec:

[Environment]::GetFolderPath("mydocuments")

Vous pouvez aussi évidemment créer une variable d’environnement avec:

$env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")
23
Hipponax43

(Juste pour réitérer les réponses précédentes) Il n'y a pas de variable d'environnement fournie prête à l'emploi (WinXP) pour le répertoire "Mes documents".

Cependant, vous pouvez définir une variable à l'aide de la commande suivante:

Testé sous Windows 7/8.1:

for /f "tokens=3* delims= " %a ^
in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') ^
do (set mydocuments=%a %b)

ou (une doublure)

for /f "tokens=3* delims= " %a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set mydocuments=%a %b)

Ce qui vous donnerait alors une variable %mydocuments%:

C:\>echo mydocuments="%mydocuments%"

mydocuments="C:\pathto\My Documents"

(Quelqu'un utilise-t-il XP/Vista? Si oui, vous pouvez le tester et nous dire si cela fonctionne?)

14
Nick Grealy

Si vous tapez:

set

Dans une invite de commande, vous obtiendrez une liste de toutes les variables d'environnement définies sur votre système.

En regardant ceux définis sur le mien (Windows 7 Home Premium), aucun ne semble pointer vers Mes documents.

FYI:

La fonction SHGetSpecialFolderPath peut être utilisée pour obtenir le chemin du répertoire Mes documents. Sinon, la méthode Environment.GetFolderPath peut être utilisée sous .Net

7
Justin
C:\Documents and Settings\mrabinovitch>set | grep -i document
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\myuser\Application Data
HOMEPATH=\Documents and Settings\myuser
USERPROFILE=C:\Documents and Settings\myuser

comme vous pouvez le constater, une telle variable n'existe pas.

5
Moisei

En plus des réponses basées sur registry , .NET et PowerShell , vous pouvez également utiliser WshSpecialFolders from WSH . Voici un script de commande/batch autonome montrant comment:

@echo off
call :script > "%temp%\%~n0.js" && cscript //nologo "%temp%\%~n0.js" %*
goto :EOF

:script
echo var specialFolders = WScript.CreateObject('WScript.Shell').SpecialFolders;
echo if (WScript.Arguments.length === 0) {
echo     for (var e = new Enumerator(specialFolders); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(e.item());
echo     }
echo } else {
echo     for (var e = new Enumerator(WScript.Arguments); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(specialFolders(e.item()));
echo     }
echo }
goto :EOF

Il émet un script WSH en JScript et l'utilise pour obtenir un ou plusieurs chemins d'accès aux jetons de dossier spéciaux fournis en tant qu'arguments. En supposant que vous sauvegardiez le script ci-dessus dans un fichier appelé specialf.cmd, le chemin d'accès au répertoire de documents de l'utilisateur actuel serait le suivant:

specialf MyDocuments

Voici une autre utilisation testant tous les jetons de dossier spéciaux:

specialf ^
  AllUsersDesktop ^
  AllUsersStartMenu ^
  AllUsersPrograms ^
  AllUsersStartup ^
  Desktop ^
  Favorites ^
  Fonts ^
  MyDocuments ^
  NetHood ^
  PrintHood ^
  Programs ^
  Recent ^
  SendTo ^
  StartMenu ^
  Startup ^
  Templates

Vous pouvez utiliser ceci pour capturer une variable d'environnement comme celle-ci:

for /f "delims=/" %p in ('specialf MyDocuments') do @set MYDOCS=%p
4
Atif Aziz

Une certaine confusion peut être due à la disponibilité des valeurs CSIDL/KNOWNFOLDERID et des variables d’environnement de commande Shell.

3
John Chacho

Réponse @NickGrealy améliorée:

  1. reg query sorties
 empty_line
reg_key_path
name nom valeur 
  1. il peut y avoir une quantité arbitraire de 'caractère espace' entre les mots d'une valeur de registre, et la chaîne %a %b n'est pas correcte dans ce cas

Utilisez donc l'option skip=2 pour ignorer les premières lignes et l'option tokens=2* pour transmettre une valeur de registre au %b var:

for /f "skip=2 tokens=2*" %A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "UserDocs=%B"

ou pour les fichiers de script:

for /f "skip=2 tokens=2*" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do set "UserDocs=%%B"

Mais en tenant compte de la valeur de registre [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\!Do not use this registry key]

Basé sur la réponse de @AtifAziz:

for /f "tokens=*" %A in ('echo WScript.Echo^(^(new ActiveXObject^("WScript.Shell"^)^).SpecialFolders^("MyDocuments"^)^)^>%TEMP%\getdoc.js ^& cscript /nologo %TEMP%\getdoc.js ^& del /q %TEMP%\getdoc.js') do @set "UserDocs=%A"
2
Dmitry Sokolov

Pour un fichier batch sous Windows 7 (au moins), la solution de Nick G nécessite un léger ajustement pour définir la variable UserDocuments définie par l'utilisateur:

FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set UserDocuments=%%a)

Notez que les seules différences sont,

  1. Utilisez un seul espace pour délimiter
  2. %% a au lieu de% a

Pour éviter de voir la ligne, mais pour voir les résultats, utilisez:

@FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @(Set UserDocuments=%%a)
@Echo ~~~~~~~~ UserDocuments=%UserDocuments%

Merci Nick G. Votre réponse m'a beaucoup appris. J'espère que ça aidera quelqu'un d'autre.

2
Rocky Scott

Testé et fonctionnant sous Win XP, Vista, 8, 8.1 et 10 !! 

@echo off
    for /f "skip=2 tokens=2*" %%c in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "docs=%%d" && echo WIN XP - 10
    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT
1

Il n’existe pas, par conception, de variable d’environnement de documents dans Windows. Vous devez en créer un personnalisé. Faites ceci en allant ici . Définissez une variable d’environnement appelée MYDOCUMENTS afin de référencer l’emplacement auquel vous souhaitez faire référence. Ensuite, il doit s'agir d'une variable d'environnement à laquelle vous faites référence par% MYDOCUMENTS%.

1
Neal Bangia

mettre à jour le fichier batch Windows (.bat) ou le script de commande Windows (.cmd)

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 SET DOCS=%USERPROFILE%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 FOR /f "tokens=3" %%x IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set docs=%%x) & echo WIN Vista - 10

    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT
0

Voici la liste complète des variables utilisateur pour tous les utilisateurs exécutant Windows.

La partie du code de requête reg trouvera cette valeur et la définira afin qu'elle puisse être utilisée immédiatement et permettre aux autres codes de la définir de manière permanente pour tous les utilisateurs . La partie du code du registre des annonces l'activera pour tous les utilisateurs. Avec setx, vous n'avez pas besoin de vous déconnecter et de vous reconnecter pour pouvoir utiliser les codes.

Les variables utilisateur actuelles ne s'appliquent qu'à la personne qui a installé ce code.

@ECHO OFF
ECHO REG ALL USER variables

ECHO all user desktop
for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do @set "ALLDT=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDT" /t  "REG_SZ"  /d "%ALLDT%" /f
 setx ALLDT "%ALLDT%"

 Echo all user's documents
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Documents"') do @set "ALLDOC=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDOC" /t  "REG_SZ"  /d "%ALLDOC%" /f
   setx ALLDOC "%ALLDOC%"

 echo all user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Programs"') do    @set "ALLSM=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSM" /t  "REG_SZ"  /d "%ALLSM%" /f 
 setx ALLSM "%ALLSM%"

  Echo all users startup
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Startup"') do @set "ALLSMSTU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSMSTU" /t  "REG_SZ"  /d "%ALLSMSTU%" /f 
   setx ALLSMSTU "%ALLSMSTU%"

  Echo all users music
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonMusic"') do @set "ALLMU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLMU" /t  "REG_SZ"  /d "%ALLMU%" /f 
   setx ALLMU "%ALLMU%"

  echo all users pictures
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonPictures"') do @set "ALLPIC=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLPIC" /t  "REG_SZ"  /d "%ALLPIC%" /f 
 setx ALLPIC "%ALLPIC%"

 Echo all users videos
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonVideo"') do @set "ALLVID=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLVID" /t  "REG_SZ"  /d "%ALLVID%" /f
 setx ALLVID "%ALLVID%"

 Echo set cerrent user variables 

 Echo current users desktop
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"') do @set "myDesktop=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myDesktop" /t  "REG_SZ"  /d "%myDesktop%" /f 
setx myDesktop "%myDesktop%"

 Echo current users documents
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "mydoc=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "mydoc" /t  "REG_SZ"  /d "%mydoc%" /f 
   setx mydoc "%mydoc%"

 Echo current user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Start Menu"') do @set "myStart=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStart" /t  "REG_SZ"  /d "%myStart%" /f 
   setx myStart "%myStart%"

  Echo current user startup
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Startup"') do @set "myStartup=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStartup" /t  "REG_SZ"  /d "%myStartup%" /f 
   setx myStartup "%myStartup%"

  Echo current users music
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Music"') do @set "myMU=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myMU" /t  "REG_SZ"  /d "%myMU%" /f 
   setx myMU "%myMU%"

 Echo current users pictures
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Pictures"') do @set "myPIC=%%d"
  REG ADD "HKEY_CURRENT_USER\Environment"  /v "myPIC" /t  "REG_SZ"  /d "%myPIC%" /f 
  setx myPIC "%myPIC%"

 Echo current users video
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Video"') do @set "myVID=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "myVID" /t  "REG_SZ"  /d    "%myVID%" /f
   setx myVID "%myVID%"

 exit
0
user9150112

Fichier de commandes Windows (.bat) ou script de commande Windows (.cmd)

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 set Docs=%UserProfile%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 set Docs=%UserProfile%\Documents & echo WIN Vista - 10

    xcopy  "C:\test.txt"  "%Docs%" /f /y 
pause
EXIT
0