Je sais que je pourrais utiliser %userprofile%\Documents
mais cela ne fonctionne que si le dossier Documents se trouve toujours à l'emplacement par défaut. Je recherche quelque chose qui fonctionne même si l'utilisateur a modifié l'emplacement (c'est-à-dire à partir de l'onglet Emplacement dans les propriétés des documents).
Réponses
Trop de publicités?Pourquoi ne pas lire cette information là où elle est enregistrée directement dans le registre de Windows :
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
@echo off && setlocal enabledelayedexpansion
set "_Key_HKCU_Path=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
set "_Folders_Refer={374DE290-123F-4565-9164-39C4925E467B},Documments,Desktop,Favorites,My Music,My Pictures,My Video,Personal,Programs,Start Menu,Startup"
(for %%i in ("!_Folders_Refer:,=","!")do call :^) %%~i) && endlocal && goto :EOF
:^)
for /f tokens^=3* %%i in ('%__APPDIR__%reg.exe query "!_Key_HKCU_Path!"^|find/i "%~1"
')do <con: set "_user_path=%%i%%j" && cmd /v/c "echo\!_user_path:REG_EXPAND_SZ=! && exit /b"
-
Produit des résultats :
C:\Users\ecker\Downloads C:\Users\ecker\Desktop C:\Users\ecker\Favorites C:\Users\ecker\Music C:\Users\ecker\Pictures C:\Users\ecker\Videos C:\Users\ecker\Music C:\Users\ecker\Pictures C:\Users\ecker\Videos C:\Users\ecker\Music C:\Users\ecker\Pictures C:\Users\ecker\Videos C:\Users\ecker\Documents C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs C:\Users\ecker\AppData\Roaming\Microsoft\Windows\Start Menu C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
Pour le seul dossier Personal/Documents :
@echo off && setlocal enabledelayedexpansion
set "_Key=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
for /f tokens^=3 %%i in ('%__APPDIR__%reg.exe query "!_Key!"^|find/i "Personal"')do <con: call set "_docs_folder=%%~i"
if exist "!_docs_folder!\My_File.docx" (
echo\!_docs_folder!\My_File.docx
echo\File exist
) else (
echo\!_docs_folder!\My_File.docx
echo\File do not exist
)
endlocal && goto :EOF
-
Résultats de sortie :
C:\Users\ecker\Documents
Obs.. : 1 Utilisez <con: call
con set "_docs_folder=%%~i"
pour développer le chemin complet dans la variable %%~i
( %UserProfile%\Documents
) à C:\Users\ecker\Documents
Obs.. : 2 Votre code ( powershell con chauve-souris / cmd ) fonctionne très bien ( pour le nom d'utilisateur/dossier sans espace ), et on peut aussi l'écrire de cette façon :
@echo off
for /f tokens^=* %%a in ('powershell -co [Environment]::GetFolderPath('Personal'^)
')do set "docs_folder=%%a" & if exist "%docs_folder%\*.*" echo\"%docs_folder%\*.*"
Envisagez d'utiliser tous les ( *
), car tokens^=*
garantit que tous les caractères de la variable de la boucle ( %%i
) sont pris pour composer la valeur dans la variable, y compris les délimiteurs standards, comme l'espace (par exemple), et si le nom d'utilisateur en contient, sans tokens^=*
seul le premier jeton sera effectivement utilisé (par défaut), et dans sa sortie/variable, il manquera les caractères supplémentaires.
-
Quelques lectures complémentaires :
[] Définir
[] CMD / ?
[] boucle for
[] For /F Loop
Sous Windows 10, il est préférable d'utiliser PowerShell :
Vous pouvez interroger le registre :
(Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').Personal
- or -
$Key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
(gp $Key).Personal
Ou bien interrogez le Shell :
(New-Object -ComObject Shell.Application).Namespace("shell:Personal").Self.Path
Sortie :
PS C:\> (Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').Personal
C:\Users\keith\Documents
PS C:\>
PS C:\> (New-Object -ComObject Shell.Application).Namespace("shell:Personal").Self.Path
C:\Users\keith\Documents
PS C:\>
@Tim
Votre ou vos navigateurs enregistrent l'emplacement de vos téléchargements par défaut. Par exemple, dans Chrome v83, je peux trouver mon dossier de téléchargements en cherchant dans... C:\Users\UserName\AppData\Local\Google\Chrome\User Données \Default\Preferences
Cherchez "répertoire_par_défaut" (y compris les guillemets).
Dans mon cas, l'emplacement des téléchargements par défaut est le suivant E:\DNLDS et j'ai trouvé la chaîne suivante dans mon Préférences fichier :
"default_directory" :" E:\DNLDS "
Note : dans la ligne ci-dessus, le logiciel du forum a supprimé le double backslash de ma réponse. La chaîne réelle trouvée dans Préférences contient deux barres obliques inversées après le nom du disque (E) comme dans...
"default_directory":"E:\\DNLDS"
D'autres navigateurs utilisent des emplacements différents pour les préférences ou les profils, mais ils doivent tous stocker l'emplacement cible pour les fichiers que vous téléchargez depuis le web.
Sachez que certaines personnes définissent plusieurs profils sur un PC donné. Votre fichier batch peut avoir besoin de télécharger un fichier de test (avec un nom unique) et de rechercher tous les emplacements par défaut pour déterminer lequel est le profil par défaut actuel. De même, certaines personnes définissent différents emplacements de téléchargement par défaut dans différents navigateurs sur le même PC. Autrement dit, certains utilisateurs ont plusieurs emplacements de téléchargement par défaut.