Я пытаюсь получить местоположение папки автозагрузки Windows (10/11) в системе с французским языком.
Обычно я использую эту команду, чтобы получить местоположение папки:
set "startupFolder=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
echo %startupFolder%
Но если системным языком является французский, путь к папке выглядит следующим образом:
"%APPDATA%\Microsoft\Windows\Menu Démarrer\Programmes\Démarrage"
Как я могу убедиться, что моя команда вернет местоположение папки автозагрузки на всех языках, а не только на английском или французском?
Папка Startup
всегда хранится в реестре Windows. Очень маловероятно, что последнее условие когда-либо будет истинным, что приведет к определению переменной окружения StartupFolder
со стандартным английским путем. Эта строка предназначена только для наихудшего сценария сильно поврежденных ключей реестра User Shell Folders
и Shell Folders
с отсутствием Startup
под обоими ключами, что еще не восстанавливается автоматически Windows, как это делается при следующем входе/входе пользователя с добавлением Startup
по умолчанию, по крайней мере, под ключом Shell Folders
.
Вы можете получить местоположение из ветки реестра пользователей 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
Пожалуйста, прочитайте мой ответ на пути к рабочему столу пользователя в пакетных файлах или ответ, указанный в этом ответе. Далее запустите в окне командной строки
reg QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Startup
. Если вы возьмете мой код, замените все вхожденияDesktop
наStartup
и используете вместоif not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"
строкуif not defined StartupFolder set "StartupFolder=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
, у вас получится идеальный рабочий код.