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é .
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
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
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.
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.
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%
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
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%
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.
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.
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.
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.
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.
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.
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 =
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.