Как получить программные файлы переменной 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).
На 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-битной.
- В меню "Пуск" Windows введите CMD в поле поиска.
- Щелкните правой кнопкой мыши cmd.exe и выберите "Запуск от имени администратора".
- При появлении запроса введите пароль администратора.
- Теперь используйте эту команду: %systemroot%\SysWoW64\regsvr32 "C:\Program Files (x86)\SubtitleCreator\SCSubtitleFilter.ax"
Если вы исправляете другую DLL, вам нужно использовать полный путь для вашей DLL внутри кавычек.