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.