Показать полную графическую версию : [решено] Как проверить разрядность операционной системы?
Elven,
видимо привел старый, который тестил ранее, чем на видео, тогда так нужно:
@echo off
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 (
reg add "HKCR\*\shell\notepad" /v "" /t REG_SZ /d "Открыть в Блокноте" /f
reg add "HKCR\*\shell\notepad" /v "icon" /t REG_SZ /d "%ProgramFiles%\Notepad++\notepad++.exe,0" /f
reg add "HKCR\*\shell\notepad\command" /v "" /t REG_SZ /d "\"%ProgramFiles%\Notepad++\notepad++.exe\" \"%%1\"" /f
) else (
reg add "HKCR\*\shell\notepad" /v "" /t REG_SZ /d "Открыть в Блокноте" /f
reg add "HKCR\*\shell\notepad" /v "icon" /t REG_SZ /d "%ProgramFiles(x86)%\Notepad++\notepad++.exe,0" /f
reg add "HKCR\*\shell\notepad\command" /v "" /t REG_SZ /d "\"%ProgramFiles(x86)%\Notepad++\notepad++.exe\" \"%%1\"" /f
)
exit /b
ps ха, стало добавлять на х86, но теперь не добавляет на х64 )))
El Sanchez
06-05-2021, 18:39
Wu-Tang, писать в HKCR не рекомендуется, это плохо, не делайте, как я.
@echo off
setlocal
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
%SystemRoot%\SysWOW64\cmd.exe /c ""%~f0" %*"
) else (
reg add "HKCR\*\shell\notepad" /ve /d "Открыть в Блокноте" /f
reg add "HKCR\*\shell\notepad" /v "icon" /d "%ProgramFiles%\Notepad++\nodepad++.exe,0" /f
call reg add "HKCR\*\shell\notepad\command" /ve /d "\"%%ProgramFiles%%\Notepad\notepad.exe\" \"%%%%1\"" /f
)
El Sanchez,
Класс! Спасибо!!!
столько вариантов перебрал, только ваш отработал корректно и на х86 и на х64.
только в пути ошибка была, я поправил:
setlocal
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
%SystemRoot%\SysWOW64\cmd.exe /c ""%~f0" %*"
) else (
reg add "HKCR\*\shell\notepad" /ve /d "Открыть в Блокноте" /f
reg add "HKCR\*\shell\notepad" /v "icon" /d "%ProgramFiles%\Notepad++\notepad++.exe,0" /f
call reg add "HKCR\*\shell\notepad\command" /ve /d "\"%%ProgramFiles%%\Notepad++\notepad++.exe\" \"%%%%1\"" /f
)
я так понимаю, здесь идет проверка на наличие syswow64?
ps и почему это плохо и не рекомендуется?
с пунктом для контекстного меню разобрались, для полного счастья решить бы вопрос с копированием папки notepad++ в зависимости от разрядности:
xcopy "Notepad++" "%ProgramFiles(x86)%\Notepad++" /H /E /G /Q /R /Y /I
те либо в ProgramFiles(x86) для х64, либо в ProgramFiles для х86.
поможите?
Wu-Tang,
а что такое вы открываете в блокноте что это требует проверку на разрядность, тем более из конт.меню, т.е. где было там и осталось?
и зачем делать проверку разрядности при копировании заранее известной разрядности программы? Вы же знаете разрядность "Notepad++" однозначно, соответственно 32-х разрядную тупо кладете в "Program Files (x86)", а 64-х разрядную в "Program Files", чего тут проверять-то?
alpap,
а вы читали вобще посты ранее?
я там описал, зачем мне это.
El Sanchez
07-05-2021, 15:19
и зачем делать проверку разрядности при копировании заранее известной разрядности программы? Вы же знаете разрядность "Notepad++" однозначно, соответственно 32-х разрядную тупо кладете в "Program Files (x86)", а 64-х разрядную в "Program Files", чего тут проверять-то? »
alpap, ему надо 32-разрядный Notepad++ разместить в 32-разрядной папке Program Files и не зависеть от разрядности интерпретатора, который его скрипт будет выполнять, ведь используемая им переменная окружения %ProgramFiles% различается.
я так понимаю, здесь идет проверка на наличие syswow64? »
Wu-Tang, нет. Если сценарий запущен в 64-разрядном интерпретаторе, то перезапускается в 32-разрядном.
ps и почему это плохо и не рекомендуется? »
Wu-Tang, HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. Производя запись в HKCR напрямую, вы не знаете куда реально пойдут изменения. В зависимости от привилегий процесса, проводящего запись, наличия дубликатов подключей в обеих ветвях реестра, запись может быть произведена в HKLM, в HKCU или в обе сразу.
для полного счастья решить бы вопрос с копированием папки notepad++ в зависимости от разрядности: »
Wu-Tang, строку с xcopy пишете до строк с reg или после, только %ProgramFiles(x86)% замените на %ProgramFiles%.
El Sanchez,
HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. Производя запись в HKCR напрямую, вы не знаете куда реально пойдут изменения. В зависимости от привилегий процесса, проводящего запись, наличия дубликатов подключей в обеих ветвях реестра, запись может быть произведена в HKLM, в HKCU или в обе сразу. »
добавляю их с привилегиям от системы, иначе не добавляются, после применения добавляются только в hkcr, в других ветках, я не обнаружил дубликатов.
Wu-Tang, строку с xcopy пишете до строк с reg или после, только %ProgramFiles(x86)% замените на %ProgramFiles%. »
setlocal
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
%SystemRoot%\SysWOW64\cmd.exe /c ""%~f0" %*"
) else (
xcopy "Notepad++" "%ProgramFiles%\Notepad++" /H /E /G /Q /R /Y /I
reg add "HKCR\*\shell\notepad" /ve /d "Открыть в Блокноте" /f
reg add "HKCR\*\shell\notepad" /v "icon" /d "%ProgramFiles%\Notepad++\notepad++.exe,0" /f
call reg add "HKCR\*\shell\notepad\command" /ve /d "\"%%ProgramFiles%%\Notepad++\notepad++.exe\" \"%%%%1\"" /f
)
exit
так?
…в других ветках, я не обнаружил дубликатов. »
Wu-Tang, HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. »
Коллега El Sanchez чуть неточно озвучил. HKCR является объединением соответствующих подразделов из HKLM и HKEY_USERS.
Например, у меня есть раздел: Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.html]
"PerceivedType"="text"
@="htmlfile"
"Content Type"="text/html"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.html\OpenWithProgids]
"ChromeHTML"=""
"htmlfile"=""
"soffice.StarCalcDocument.6"=" "
"soffice.StarWriterDocument.6"=" "
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.html\PersistentHandler]
@="{eec97550-47a9-11cf-b952-00aa0051fe20}"
Есть раздел: Windows Registry Editor Version 5.00
[HKEY_USERS\S-1-5-21-GUID-1000_Classes\.html]
@="PaleMoonHTML"
[HKEY_USERS\S-1-5-21-GUID-1000_Classes\.html\OpenWithProgids]
"bc1c4f92.Windows.XP.Mode.1"=""
И есть раздел: Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.html]
@="PaleMoonHTML"
"Content Type"="text/html"
"PerceivedType"="text"
[HKEY_CLASSES_ROOT\.html\OpenWithProgids]
"bc1c4f92.Windows.XP.Mode.1"=""
"ChromeHTML"=""
"htmlfile"=""
"soffice.StarCalcDocument.6"=" "
"soffice.StarWriterDocument.6"=" "
[HKEY_CLASSES_ROOT\.html\PersistentHandler]
@="{eec97550-47a9-11cf-b952-00aa0051fe20}"
который формируется динамически и представляет собой объединение двух предыдущих разделов реестра с приоритетом раздела пользователя (обратите внимание на результирующее значение по умолчанию для раздела HKEY_CLASSES_ROOT\.html).
В остальном:
Производя запись в HKCR напрямую, вы не знаете куда реально пойдут изменения. В зависимости от привилегий процесса, проводящего запись, наличия дубликатов подключей в обеих ветвях реестра, запись может быть произведена в HKLM, в HKCU или в обе сразу.
всё верно (есть токмо сомнения насчёт «в обе сразу» :)).
Iska,
HKCR является объединением соответствующих подразделов из HKLM и HKEY_USERS. »
вот этот момент мне известен со времен сборки xp uttended, поэтому я эти ключи в root и писал, поэтому я даже удивился от тезиса товарища El Sanchez, касаемо веток реестра.
El Sanchez
10-05-2021, 16:36
есть токмо сомнения насчёт «в обе сразу» »
Iska, согласен, это я загнул.
вот этот момент мне известен со времен сборки xp uttended, поэтому я эти ключи в root и писал »
Wu-Tang, пишите. Когда-нибудь подобный сценарий будет запускать непривилегированный пользователь для записи в отсутствующий в реестре подраздел. Откройте консоль без всяких там запусков от админа (нет, UAC отключать не надо) и выполните reg add HKCR\.foo. Отказано в доступе, верно? Попытка записи в HKLM не удалась, это понятно, пользователь без прав же, но по логике должно было тогда в HKCU записать, а там тоже пусто, и выходит, что сценарий есть, а толку нет.
El Sanchez,
этот вариант я продумал ))) тесты провожу под обычным юзером с включенным uac, у меня твики упакованы модулем 7zsfx и после распака добавляются с повышением прав до - система с помощью powerrun.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.