Quelle est la variable d’environnement pour le chemin d’access 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 OS anglais. Est-il possible de le faire dans un fichier de commandes qui fonctionnera sur toute version internationalisée?

METTRE À JOUR

J’ai essayé le fichier de commandes 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 a obtenu cette sortie:

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

 HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossiers du shell de l'utilisateur
     Desktop REG_EXPAND_SZ% USERPROFILE% \ Desktop


 S: \> FOR / F "jetons usebackq = 3 sauter = 4"% i dans (`REG QUERY" HKCU \ Logiciel \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossier du shell utilisateur
 s "/ v Desktop`) DO SET DESKTOPDIR =% i

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

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

 S: \> ECHO ECHO est activé.
 ECHO est activé.

    J’ai trouvé que la meilleure solution était d’utiliser un vbscript avec le fichier de commandes.

    Voici le fichier de commandes:

     @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 risquée.

    Je l’ai testé sur un PC anglais et sur un PC français – cela semble fonctionner (Windows XP).

    HTH,

    Iulian Şerbănoiu

    Pour être sûr, vous devez utiliser les API appropriées dans Powershell (ou VBScript)
    Utilisation de PowerShell:

     [Environment]::GetFolderPath("Desktop") 

    Copiez quelque chose en utilisant Powershell:

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

    Voici un exemple de VBScript pour obtenir le chemin du bureau:

     dim WSHShell, desktop, pathssortingng, objFSO set objFSO=CreateObject("Scripting.FileSystemObject") Set WSHshell = CreateObject("WScript.Shell") desktop = WSHShell.SpecialFolders("Desktop") pathssortingng = objFSO.GetAbsolutePathName(desktop) WScript.Echo pathssortingng 

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

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

    Sous XP, vous ne pouvez pas l’utiliser pour d’autres dossiers, sauf pour Desktop My documents pour Meus Documentos et Local Settings pour Configuracoes locais Personnellement, je pense que c’est une mauvaise chose lorsque vous projetez un système d’exploitation.

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

    Cependant, si vous travaillez de manière interactive à l’invite, ou si vous voulez simplement quelque chose qui fonctionne sur votre ordinateur, le caractère tilda (~) fait référence au dossier de base de l’utilisateur actuel. Ainsi, ~/desktop est le dossier de bureau de l’utilisateur.

    Non seulement cela ne fonctionnerait pas pour une version internationale de Windows, mais cela échouerait si l’utilisateur avait modifié le Registre pour que son dossier Desktop se trouve ailleurs. Vous pouvez interroger le Registre pour 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 ceci 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% 

    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, comme vous demandez spécifiquement une version non anglaise de Windows, Heres est un exemple de ma propre version allemande (Window7-64bit) :

     set> env.txt
     type env.txt
    
     ALLUSERSPROFILE = C: \ ProgramData
     APPDATA = C: \ Users \ SOF \ AppData \ Roaming
     CommonProgramFiles = C: \ Program Files \ Fichiers communs
     CommonProgramFiles (x86) = C: \ Program Files (x86) \ Fichiers communs
     CommonProgramW6432 = C: \ Program Files \ Fichiers communs
     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 = Famille AMD64 15 Modèle 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:
     Racine système = 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 \ Outils \
     windir = C: \ Windows
    
    

    dans Windows 7, cela renvoie le chemin du bureau:

     FOR / F "usebackq tokens = 3" %% i in (`REG QUERY" HKCU \ Logiciels \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossiers du shell utilisateur "/ v Desktop`) DO SET DESKTOPDIR = %% i 
     FOR / F "usebackq delims =" %% i dans (`ECHO% DESKTOPDIR%`) DO SET DESKTOPDIR = %% i 
     ECHO% DESKTOPDIR% 
    

    Ce n’est pas une solution, mais j’espère que cela vous aidera: Cela se rapproche de cela, sauf que lorsque la clé =% userprofile% \ desktop, la copie échoue même si zdesktop =% userprofile% \ desktop. Je pense 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 parsing avec succès la clé REG mais si la clé contient un% var% incorporé, il ne sera pas traduit pendant la commande de copie.

    J’ai eu un problème similaire (et VBScript ou PowerShell n’était pas une option) et le code que j’ai 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 arrivé à 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 l’expansion différée des variables d’environnement.

    Bien que je réalise que cet article est un peu ancien, j’ai pensé que cela pourrait aider les gens dans une situation similaire. J’ai fait une rapide ligne VBScript pour extraire des informations pour n’importe quel dossier spécial que vous souhaitez (pas de vérification d’erreur cependant) et cela fonctionne comme ceci:

    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 que j’exécute, je suppose que vous faites la même chose (j’ai eu des situations où les utilisateurs ont supprimé C: \ Windows \ system32 de leur chemin, ou réussi à se débarrasser de cscript.exe, ou il est infecté ou ne fonctionne pas).

    Copiez maintenant 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" "%SHELLDIR%\" 

    Dans le code ci-dessus, vous pouvez remplacer “Desktop” par un dossier spécial valide (Favorites, StartMenu, etc. – la liste officielle complète est à https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs .84% 29.aspx ) et bien sûr avec le fichier que vous souhaitez 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 suffisamment simple pour s’adapter à plusieurs applications.

    Oh, et pour ceux qui ne connaissent pas le "%~dp0" est juste le répertoire à partir duquel le script est appelé. Il fonctionne également pour les chemins UNC, ce qui rend le fichier batch très portable. Cela se termine spécifiquement par un “\” final, ce qui peut sembler étrange à première vue.

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

    CSIDL_DESKTOPDIRECTORY

    Le répertoire du système de fichiers utilisé pour stocker physiquement les objects de fichiers sur le bureau (à ne pas confondre avec le dossier du bureau). Un chemin typique est C: \ Documents and Settings \ username \ Desktop.

    Je ne sais pas comment obtenir ceux de la ligne de commande, cependant.

    Version multilingue, testée sur OS japonais
    Fichier batch

     set getdesk = REG QUERY "HKCU \ Logiciels \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossiers du shell utilisateur" / 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 =
    définir le bureau =

    Cela devrait fonctionner quelle que soit la version linguistique de Windows et quel que soit l’emplacement du dossier. Peu importe qu’il y ait 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 il n’est pas disponible par défaut.

    J’utilise ce code pour obtenir les chemins du bureau d’utilisateur et du bureau public à partir du registre, testé sur Windows XP SP2 pt-PT et Windows 10 b14393 en-US, donc cela 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 contiennent une tabulation à l’intérieur du “”, certains éditeurs de texte ajoutent des espaces lorsque vous appuyez sur la touche TAB. Assurez-vous donc d’avoir une tabulation réelle au lieu d’espaces.

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

    Je sais que c’est un vieux sujet, 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 c’est utile car j’ai rencontré une situation où une machine cliente n’avait pas de valeur dans $ home.