Я пытаюсь получить местоположение папки автозагрузки Windows (10/11) в системе с французским языком.
Обычно я использую эту команду, чтобы получить местоположение папки:
set "startupFolder=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
echo %startupFolder%
Но если системным языком является французский, путь к папке выглядит следующим образом:
"%APPDATA%\Microsoft\Windows\Menu Démarrer\Programmes\Démarrage"
Как я могу убедиться, что моя команда вернет местоположение папки автозагрузки на всех языках, а не только на английском или французском?
Вы можете получить местоположение из ветки реестра пользователей HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
под значением Startup
.
Пример:
@Echo Off
SetLocal EnableExtensions
Set "UserBranch=HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
Set "ShellFolder=Startup"
Set "%ShellFolder% = "
For /F "EOL=H Tokens=1-2,*" %%G In ('%SystemRoot%\System32\reg.exe Query "%UserBranch%" /V "%ShellFolder%" 2^>NUL') Do Set "%%G=%%I"
If Defined %ShellFolder% (Set %ShellFolder%) & Pause
Однако приведенный выше код не будет напрямую изменен для всех значений пользовательского ключа, например History
, (из-за игнорирования E
nd O
f L
строк, начинающихся с H
), а также Local AppData
, My Music
, My Pictures
, My Video
и Start Menu
(из-за на пробел в именах их значений). То же самое относится и к Common AppData
, Common Desktop
, Common Documents
, Common Programs
, Common Start Menu
, Common Startup
и Common Templates
под машинным ключом HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
.
Поэтому, если вы хотите иметь возможность использовать код и для этих случаев, вы можете изменить его, чтобы он соответствовал всем сценариям.
Пример:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "RootKey=HKEY_LOCAL_MACHINE"
Set "ShellFolder=Common Start Menu"
Set "Branch=\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
Set "%ShellFolder: =_% = "
For /F "Tokens=1-2,*" %%G In ('%SystemRoot%\System32\reg.exe Query "%RootKey%%Branch%" /V "%ShellFolder%" 2^>NUL') Do (
If "%%H" == "REG_EXPAND_SZ" (Set "%%G=%%I") Else (Set "_=%%I"
SetLocal EnableDelayedExpansion
For /F "Tokens=*" %%J In ("!_:*REG_EXPAND_SZ=!") Do EndLocal & Set "%ShellFolder: =_%=%%J"
)
)
If Defined %ShellFolder: =_% (Set %ShellFolder: =_%) & Pause