Получить папку автозагрузки Windows из CMD с другим языком системы

Я пытаюсь получить местоположение папки автозагрузки Windows (10/11) в системе с французским языком.

Обычно я использую эту команду, чтобы получить местоположение папки:

set "startupFolder=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
echo %startupFolder%

Но если системным языком является французский, путь к папке выглядит следующим образом:

"%APPDATA%\Microsoft\Windows\Menu Démarrer\Programmes\Démarrage"

Как я могу убедиться, что моя команда вернет местоположение папки автозагрузки на всех языках, а не только на английском или французском?


1
61
1

Ответ:

Решено

Вы можете получить местоположение из ветки реестра пользователей 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, (из-за игнорирования End Of 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