Как получить программные файлы переменной x86 env?

Я хотел бы знать, как я могу отобразить расположение программных файлов (x86) в командной строке. Я использую Windows 7 64bit.

Я пробовал:

echo %programfiles(x86)% а также echo %programfiles%,
оба из которых отображают только C:\Program Files

Когда я вручную проверил реестр,
HKLM/ Программное обеспечение / Microsoft / Windows / Currentversion,
programfilesdir указывает на C:\Program Files а также

HKLM/ Программное обеспечение / WOW64 / Microsoft / winodws / currentversion,
programfilesdir указывает на C:\Program Files (x86),

Но почему я всегда отображаюсь с C:\Program Files??

6 ответов

Решение

На 64-битной машине, работающей в 64-битном режиме:

  • echo %programfiles% ==> C:\Program Files
  • echo %programfiles(x86)% ==> C:\Program Files (x86)

На 64-битной машине, работающей в 32-битном (WOW64) режиме:

  • echo %programfiles% ==> C:\Program Files (x86)
  • echo %programfiles(x86)% ==> C:\Program Files (x86)

На 32-разрядной машине, работающей в 32-разрядном режиме:

  • echo %programfiles% ==> C:\Program Files
  • echo %programfiles(x86)% ==> %programfiles(x86)%

Еще одна важная переменная среды:

% ProgramW6432%

Итак, на 64-битной машине, работающей в 32-битном (WOW64) режиме:

  • echo% programfiles% ==> C: \ Program Files (x86)
  • echo% programfiles (x86)% ==> C: \ Program Files (x86)
  • echo% ProgramW6432% ==> C: \ Program Files

Из Википедии:

Переменная% ProgramFiles% указывает на каталог Program Files, в котором хранятся все установленные программы Windows и другие. По умолчанию в англоязычных системах используется "C:\Program Files". В 64-разрядных выпусках Windows (XP, 2003, Vista) также есть%ProgramFiles(x86)%, по умолчанию "C:\Program Files (x86)" и%ProgramW6432%, по умолчанию "C: \Программные файлы". Сам% ProgramFiles% зависит от того, является ли процесс, запрашивающий переменную среды, самим 32-разрядным или 64-разрядным (это вызвано 64-разрядным перенаправлением Windows-on-Windows).

Ссылка: http://en.wikipedia.org/wiki/Environment_variable

На 64-битной машине Windows echo %programfiles(x86)% печатает C:\Program Files (x86)

В 64-разрядной системе Windows чтение различных переменных среды и некоторых ключей реестра Windows перенаправляется в разные источники в зависимости от того, является ли процесс, выполняющий чтение, 32-разрядным или 64-разрядным.

В таблице ниже перечислены эти источники данных:

      X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
Y = HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion
Z = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
     
READING ENVIRONMENT VARIABLES:    Source for 64-bit process               Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
                %ProgramFiles% :  X\ProgramW6432Dir                       X\ProgramFilesDir (x86)
           %ProgramFiles(x86)% :  X\ProgramFilesDir (x86)                 X\ProgramFilesDir (x86)
                %ProgramW6432% :  X\ProgramW6432Dir                       X\ProgramW6432Dir
     
          %CommonProgramFiles% :  X\CommonW6432Dir                        X\CommonFilesDir (x86)
     %CommonProgramFiles(x86)% :  X\CommonFilesDir (x86)                  X\CommonFilesDir (x86)
          %CommonProgramW6432% :  X\CommonW6432Dir                        X\CommonW6432Dir
     
                 %ProgramData% :  Z\ProgramData                           Z\ProgramData


      READING REGISTRY VALUES:    Source for 64-bit process               Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
             X\ProgramFilesDir :  X\ProgramFilesDir                       Y\ProgramFilesDir
       X\ProgramFilesDir (x86) :  X\ProgramFilesDir (x86)                 Y\ProgramFilesDir (x86)
            X\ProgramFilesPath :  X\ProgramFilesPath = %ProgramFiles%     Y\ProgramFilesPath = %ProgramFiles(x86)%
             X\ProgramW6432Dir :  X\ProgramW6432Dir                       Y\ProgramW6432Dir
     
              X\CommonFilesDir :  X\CommonFilesDir                        Y\CommonFilesDir
        X\CommonFilesDir (x86) :  X\CommonFilesDir (x86)                  Y\CommonFilesDir (x86)
              X\CommonW6432Dir :  X\CommonW6432Dir                        Y\CommonW6432Dir
     

Так, например, для 32-разрядного процесса источником данных для переменных среды и является значение реестра.

Однако для 64-разрядного процесса источником данных для переменной среды является значение реестра... а источником данных для %ProgramFiles(x86)%переменная окружения — это значение реестра

Большинство установок Windows по умолчанию помещают строку вроде C:\Program Files (x86)в значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)но это (и другие) можно изменить.

Все, что введено в эти значения реестра Windows, будет считано проводником Windows в соответствующие переменные среды при входе в систему, а затем скопировано в любой дочерний процесс, который он впоследствии порождает.

Значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPathособенно примечательно, потому что большинство установок Windows помещают в него строку для чтения 64-битными процессами. Эта строка относится к переменной окружения %ProgramFiles%который, в свою очередь, берет свои данные из значения реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir... если какая-то программа не изменит значение этой переменной среды априори.

Я написал небольшую утилиту, которая отображает эти переменные среды для 64-битных и 32-битных процессов. Вы можете скачать его здесь.
Исходный код VisualStudio 2017 включен, а скомпилированные 64-разрядные и 32-разрядные двоичные исполняемые файлы находятся в каталогах. ..\x64\Releaseи ..\x86\Release, соответственно.

ИМХО, в этом обсуждении не хватает одного момента: какую бы переменную вы ни использовали, она всегда будет указывать на соответствующую папку. Это становится критичным в тех редких случаях, когда Windows установлена ​​не на C:\.

Я попробовал несколько вариантов этого, которые я нашел в сети, и ни один из них не сработал. Я пытался исправить проблему reg с Subtitle Creator.

После некоторых проб и ошибок вот тот, который работал для меня под Windows 7 64-битной.

  1. В меню "Пуск" Windows введите CMD в поле поиска.
  2. Щелкните правой кнопкой мыши cmd.exe и выберите "Запуск от имени администратора".
  3. При появлении запроса введите пароль администратора.
  4. Теперь используйте эту команду: %systemroot%\SysWoW64\regsvr32 "C:\Program Files (x86)\SubtitleCreator\SCSubtitleFilter.ax"

Если вы исправляете другую DLL, вам нужно использовать полный путь для вашей DLL внутри кавычек.

Другие вопросы по тегам