Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как проверить разрядность операционной системы? (http://forum.oszone.net/showthread.php?t=172610)

SvoiLudi 08-04-2010 22:50 1388287

[решено] Как проверить разрядность операционной системы?
 
Как проверить разрядность операционной системы?

У виндоуз 7 есть 2 версии: 64-х разрядная и 32-х разрядная.

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

SvoiLudi 08-04-2010 22:52 1388290

в реестре ветки добавляются у 64-х, но как проверить?

gora 08-04-2010 22:53 1388293

Код:

@Echo Off
:: Варианит 1
Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
Echo %xOS%
Pause

:: ===================================================================================
:: Варианит 2

Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
Echo %xOS%
Pause

:: ===================================================================================
:: Запуск приложений в зависимости от разрядности из разных папок с именами x64 и x86

Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
"c:\My Test\%xOS%\install.exe" /S

:: ===================================================================================
:: Запуск приложений в зависимости от разрядности из одной папки с именами сожержащими суффикс x64 и x86 (install_x64.exe и install_x86.exe)

Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
"c:\My Test\install_%xOS%.exe" /S

:: ===================================================================================
:: Запуск приложений в зависимости от разрядности из разных папок, с разными именами и/или ключами

Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
If %xOS%==x86 ("c:\My Test\i86\install.exe" /S) Else ("c:\My Test\AMD64\setup.msi" /qn)


seriych 08-04-2010 23:55 1388321

Так покороче:
Код:

set xOS=x86
if DEFINED ProgramFiles(x86) set xOS=x64

Возможно, вариант, предложенный gora, корректнее, но я не видел 32-битных систем с определенной системной переменной ProgramFiles(x86) и во всех x64 системах, которые я видел, эта переменная определена. Я определяю именно так.

SvoiLudi 09-04-2010 14:00 1388702

PATH %PATH%;q:;w:;e:;r:;t:;y:;u:;i:;o:;p:;a:;s:;d:;f:;g:;h:;j:;k:;l:;z:\;x:;c:;v:;b:;n:;m:;
"%WINDIR%\regedit.exe" /s 32x.reg
Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
if "%xOS%"=="x64" "%WINDIR%\regedit.exe" /s 64x.reg

в реестр ничего не добавляет, а если убрать /s то предлагает добавить в реестр, что требует действия пользователя, что неудобно. Как убрать запрос?
64x.reg находится на сетевом диске z:\

gora 09-04-2010 15:10 1388755

SvoiLudi, на форуме
Цитата:

темы организуются по принципу ''одна проблема – одна тема''.
На Ваш вопрос в заголовке темы ответ уже дан, для нового вопроса откройте новую тему и постарайтесь его правильно сформулировать, примерно так: "Как на 64-разрядной системе внести данные из reg файла, находящегося на сетевом диске z:\, в реестр с помощью bat файла запущенного (откуда? с правами администратора?) в 32 (64)-разрядной среде? Reg файл прикрепил."

vcrank 01-06-2012 12:34 1925981

Извините, если не в тему, но не получается корректно обработать запуск программы в зависимости от разрядности системы
Пример:
PHP код:

@ECHO OFF
SET ProgName
=WinRar
SET ProgVer
=4.20 Beta 3
SET FileNameX86
=wrar420b3ru.exe
SET FileNameX64
=winrar-x64-420b3ru.exe
SET FileName
=
SET PFPath=
TITLE %ProgName% %ProgVer%

CLS
COLOR 1A

IF EXIST "%ProgramFiles(x86)%" (
    IF 
DEFINED FileNameX64 (
        
SET FileName=%FileNameX64%
        
SET PFPath=%PROGRAMFILES%
    ) ELSE (
        
SET FileName=%FileNameX86%
        
SET PFPath=%PROGRAMFILES(x86)%
    )
) ELSE (
    
SET FileName=%FileNameX86%
    
SET PFPath=%PROGRAMFILES%
)

ECHO 
Импорт настроек
ECHO.
regedit /S Settings.reg
ECHO.

START /WAIT %FileName% /S

ECHO Установка завершена
ECHO. 

Задача: создать почти универсальный установочный bat-файл. Менять только значение переменных в самом начале
В данном скрипте почему-то съедается скобка в пути у Programm Files (x86

gora 07-06-2012 08:21 1929842

Цитата:

Цитата vcrank
почему-то съедается скобка в пути у Programm Files (x86 »

Попробуйте так:
Код:

@ECHO OFF
SET ProgName=WinRar
SET ProgVer=4.20 Beta 3
SET FileNameX86=wrar420b3ru.exe
SET FileNameX64=winrar-x64-420b3ru.exe
SET FileName=
SET PFPath=
TITLE %ProgName% %ProgVer%

CLS
COLOR
1A
Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64

SET FileName=%FileNameX86%
SET PFPath=%PROGRAMFILES(x86)%

IF %xOS%==x64 (
    IF DEFINED FileNameX64 (
        SET FileName=%FileNameX64%
        SET PFPath=%PROGRAMFILES%
    )
)
ELSE (
    SET FileName=%FileNameX86%
    SET PFPath=%PROGRAMFILES%
)

ECHO PFPath=%PFPath%
ECHO FileName=%FileName%
Pause


vcrank 07-06-2012 14:17 1930034

Цитата:

Цитата gora
Попробуйте так: »

На системе X86 выдёт
всё как и положено, а вот на x64
Выдёт всё равно путь и имя файла как для системы x86 (Program Files (x86) и wrar420b3ru.exe)

Такое ощущение, что условие ELSE срабатывает в любом случае
Пока делаю костыль с добавлением GoTo

gora 07-06-2012 15:06 1930075

Тогда так:
Код:

@ECHO OFF
SET ProgName=WinRar
SET ProgVer=4.20 Beta 3
SET FileNameX86=wrar420b3ru.exe
SET FileNameX64=winrar-x64-420b3ru.exe
TITLE %ProgName% %ProgVer%

CLS
COLOR
1A

Call :_Set_Var

ECHO xOS=%xOS%
ECHO PFPath=%PFPath%
ECHO FileName=%FileName%
Pause

:_Set_Var
Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
SET FileName=%FileNameX86%
SET PFPath=%PROGRAMFILES%
IF %xOS%==x86 GoTo :EOF
SET PFPath=%PROGRAMFILES(x86)%
IF Not DEFINED FileNameX64 GoTo :EOF
SET FileName=%FileNameX64%
SET PFPath=%ProgramW6432%
GoTo :EOF

Так не должно зависеть от среды запуска (х86\х64) на х64 ОС

fly380 12-06-2012 17:41 1932990

День добрый! Подскажите как на основе выше приведенного примера запустить программу driver install.ехе исходя из розрядности из папки х86 или х64?

gora 12-06-2012 17:48 1932996

Цитата:

Цитата fly380
запустить программу driver install.ехе исходя из розрядности из папки х86 или х64 »

Код:

Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
"%xOS%\driver install.ехе"


CyberMuesli 12-06-2012 18:14 1933009

Цитата:

Цитата gora
If Defined PROCESSOR_ARCHITEW6432 »

А если на 64-разрядном железе установлена 32 разрядная винда, будет ли определена переменная PROCESSOR_ARCHITEW6432, и чему она будет равна, если да?

fly380 12-06-2012 18:25 1933016

Работает но есть одно но, driver install.ехе скомпилирован из *.bat и этот батник запускается и запускает driver install.ехе как бы внутри себя и команды из driver install.ехе не выполняются. За исключением одной
Код:

@var WSHShell = WScript.CreateObject( "WScript.Shell" ); > %temp%\mes.js
@WSHShell.Popup( "Установка завершена" ); >> %temp%\mes.js
@START %temp%\mes.js


Foreigner 12-06-2012 18:28 1933019

Цитата:

Цитата CyberMuesli
будет ли определена переменная PROCESSOR_ARCHITE »

Будет равна "x86"

fly380 12-06-2012 18:38 1933023

Цитата:

Цитата fly380
Работает но есть одно но, driver install.ехе скомпилирован из *.bat и этот батник запускается и запускает driver install.ехе как бы внутри себя и команды из driver install.ехе не выполняются. »

Подскажите можно как исправить это?

CyberMuesli 12-06-2012 19:08 1933030

Цитата:

Цитата Foreigner
Будет равна "x86" »

Похоже, что нет. Нашел компьютер с Intel Core2 Quad Q9400 с 32-х разрядной версией WinServer 2003. Процессор вроде 64 разрядный, а переменная PROCESSOR_ARCHITEW6432 не определена вообще.

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

Цитата:

Цитата seriych
ProgramFiles(x86).... Я определяю именно так. »

Плюсану. Я тоже

gora 12-06-2012 19:21 1933036

Цитата:

Цитата CyberMuesli
а переменная PROCESSOR_ARCHITEW6432 не определена вообще. »

Она может быть не определена, но это не делает строку неработоспособной. В этом случает разрядность определяется по значению переменной %PROCESSOR_ARCHITECTURE%

CyberMuesli 12-06-2012 19:25 1933038

Цитата:

Цитата gora
Она может быть не определена, но это не делает строку неработоспособной »

Я не утверждал обратного

fly380 12-06-2012 19:45 1933048

Цитата:

Работает но есть одно но, driver install.ехе скомпилирован из *.bat и этот батник запускается и запускает driver install.ехе как бы внутри себя и команды из driver install.ехе не выполняются.
Точнее строки
Код:

Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64

пишутся уже внутри driver install.ехе, хотя не пойму как и почему.
Парни скажите можно это исправить? А то очень нехочется лепить сложный инсталятор :(

vcrank 28-06-2012 08:55 1941853

Какая-то ерунда снова получается. В прошлый раз не всё проверил.
Имеется батник:
Код:

@ECHO OFF
SET ProgName=AIMP
SET ProgVer=3.10 RC2 build 1051
SET FileNameX86=AIMP3.exe
SET FileNameX64=
SET FileName=
SET PFPath=
TITLE %ProgName% %ProgVer%

CLS
COLOR 1A

CALL :_Set_Var

ECHO В какой каталог поставить приложение:
ECHO.
ECHO.
ECHO [1] %PFPath%\%ProgName%
ECHO [2] D:\UserData\Programs\%ProgName%
ECHO.
ECHO.
SET /p sert="Нажмите соответствующий номер:"
IF '%sert%'=='1' (
        SET PFPath=%PFPath%\%ProgName%
) ELSE IF '%sert%'=='2' (
        SET PFPath=D:\UserData\Programs\%ProgName%
) ELSE IF ErrorLevel 0 GoTo :END

%FileName% -d"%PFPath%" -s2
reg add hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\AIMP3 /v UninstallString /t REG_SZ /F /d "%PFPath%\Uninstall.exe"

:_Set_Var
SET xOS=x86
IF Defined PROCESSOR_ARCHITEW6432 (
        SET xOS=x64
) ELSE IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" SET xOS=x64
SET FileName=%FileNameX86%
SET PFPath=%PROGRAMFILES%
IF %xOS%==x86 GoTo :EOF
SET PFPath=%PROGRAMFILES(x86)%
IF Not DEFINED FileNameX64 GoTo :EOF
SET FileName=%FileNameX64%
SET PFPath=%ProgramW6432%
GoTo :EOF

:END

Если запускать на x86, то выполняется без проблем
Если запускать на x64, то появляется ошибка: Непредвиденное появление: \AIMP

gora 28-06-2012 10:12 1941883

vcrank, а так?
Код:

@ECHO OFF
SET ProgName=AIMP
SET ProgVer=3.10 RC2 build 1051
SET FileNameX86=AIMP3.exe
SET FileNameX64=
SET FileName=
SET PFPath=
TITLE %ProgName% %ProgVer%

CLS
COLOR
1A

CALL :_Set_Var

ECHO В какой каталог поставить приложение:
ECHO.
ECHO.
ECHO [1] %PFPath%\%ProgName%
ECHO [2] D:\UserData\Programs\%ProgName%
ECHO.
ECHO.
Set fPFPath=
SET /p sert="Нажмите соответствующий номер:"
IF '%sert%'=='1' SET fPFPath=%PFPath%\%ProgName%
IF '%sert%'=='2' SET fPFPath=D:\UserData\Programs\%ProgName%
IF Not Defined fPFPath GoTo :END

Echo %FileName% -d"%fPFPath%" -s2
Echo reg add hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\AIMP3 /v UninstallString /t REG_SZ /F /d "%fPFPath%\Uninstall.exe"
Pause
Exit


:_Set_Var
SET xOS=x86
IF Defined PROCESSOR_ARCHITEW6432 (SET xOS=x64) ELSE IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" SET xOS=x64
SET FileName=%FileNameX86%
SET PFPath=%PROGRAMFILES%
IF %xOS%==x86 GoTo :EOF
SET PFPath=%PROGRAMFILES(x86)%
IF Not DEFINED FileNameX64 GoTo :EOF
SET FileName=%FileNameX64%
SET PFPath=%ProgramW6432%
GoTo :EOF

:END

Echo Error
Pause
Exit


vcrank 29-06-2012 08:13 1942495

gora,
Цитата:

Цитата gora
а так? »

Извините, что долго не отвечал. Так работает. Будем работать дальше :) Вдруг ещё что-то всплывёт

L1nk3R 11-07-2012 13:26 1949894

Всё это видел. Тема не решена.
Продолжу вопрос здесь.

Привет. Кто подскажет как запустить setup.exe в соответствии с разрядностью системы? Код по проще можно?

Нужен только запуск.
Например
Код:

@ echo
run setup.exe x86
run setup.exe x64

как это сделать?

sov44 11-07-2012 14:18 1949930

L1nk3R, а посмотреть на код gora парой постов выше и проявить смекалку сложно?
Код:

SET xOS=x86
IF Defined PROCESSOR_ARCHITEW6432 (SET xOS=x64) ELSE IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" SET xOS=x64
IF %xOS%==x86 (run setup.exe x86) else (run setup.exe x64)


L1nk3R 11-07-2012 14:25 1949934

sov44, я в батнике мало что понимаю.

Данная тема соответствует больше вот этому примеру:
Код:

@echo off
Title Проверка разрядности операционной системы
echo Архитектура вашего процессора: %PROCESSOR_ARCHITECTURE%
pause

sov44, не работает, пишет ""run" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."

sov44 11-07-2012 14:43 1949948

Цитата:

Цитата L1nk3R
пишет ""run" не является внутренней или внешней командой »

Всё верно. В скобках указывайте только путь и имя запускаемой программы без "run", "x86" и т.п. Если в имени и (или) в пути есть пробелы, заключайте путь с именем в кавычки.

L1nk3R 11-07-2012 15:40 1949990

sov44, Спасибо добрый человек за помощь! Всё работает :).

gen0m.rsw 30-09-2012 10:18 1996920

Запуск x86 x64
 
Всем участникам форума респект!!!
Ближе к делу!
Батник должон , определить разрядность ОС, и запустить надлежащий EXE(или MSI), с параметром
К примеру :
x86 setup_x86.exe /S
или
x64 setup_x64.msi /qn

Заранее спасибо!!!

foma555 11-10-2012 20:25 2003679

gen0m.rsw, попробуй как-то так:
Код:

@echo off
Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64

IF %xOS%==x86 ( "setup_x86.exe" /S) else ("x64 setup_x64.msi" /qn)
pause
exit


gora 12-10-2012 08:47 2003947

Ещё один, более короткий, вариант записи определения разрядности, предложенной в посте 3.
Код:

Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86


Salmo 15-10-2012 21:18 2006060

А я так:
Код:

Set xOS=x86
IF EXIST %windir%\Sysnative\* Set xOS=x64

Определение из 32 битного приложения

DesmondTruman 16-10-2012 20:27 2006668

Код:

Set xOS=x86  If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
Код:

copy "test.exe" "%systemroot%\system32\test.exe" /y
copy "test.exe" "%systemroot%\system64\test.exe" /y

Вот нужно к примеру исходя из переменной xOS использовать соответствующий путь (system32\system64). Как более элегантно их соединить не используя call?

Salmo 16-10-2012 23:05 2006793

Цитата:

Цитата DesmondTruman
исходя из переменной xOS использовать соответствующий путь (system32\system64) »

Скажите, пожалуйста, что Вы называете соответствующим путем и что такое system64? Если это SysWOW64, то укажите, где должен оказаться test.exe в 64 битной системе, - в system32 (64 битная среда) или в SysWOW64 (32 битная)?

angel_lyucifer 16-01-2013 05:05 2067789

Батник который определяет разрядность системы x86 или x64
 
Привет, мне нужен батник который определяет разрядность системы x86 или x64 если система 32 битная, то есть x86 то тогда нужно запустить файл 1.exe если система 64 битная то есть x64 тогда нужно запустить файл 2.exe

Кто может подскажите варианты такого батника пожалуйста.

zion87 16-01-2013 06:14 2067795

Код:

@echo off
set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
reg.exe Query %RegQry% > checkOS.txt
find /i "x86" < CheckOS.txt > StringCheck.txt

if %ERRORLEVEL% == 0 (
goto os32
) else (
goto os64
)

:os32
1.exe
goto check_done

:os64
2.exe

:check_done
del StringCheck.txt, CheckOS.txt

Стучим в бубен )))

angel_lyucifer 16-01-2013 17:13 2068204

Спасибо zion87!

7ka 26-02-2013 11:27 2099160

2ALL
Код:

@Echo Off
If !%PROCESSOR_ARCHITECTURE%==!x86 Goto Install_x86
If !%PROCESSOR_ARCHITECTURE%==!AMD64 Goto Install_x64
Goto End
 
:Install_x86
start "" /wait msiexec /i"%~dp0\setup-x86.msi" /quiet /norestart
Goto End
 
:Install_x64
start "" /wait msiexec /i"%~dp0\setup-x64.msi" /quiet /norestart
Goto End
 
:End


gora 26-02-2013 11:48 2099177

Цитата:

Цитата 7ka
If !%PROCESSOR_ARCHITECTURE%==!x86 Goto Install_x86 »

1 Символ ! здесь применен, видимо, для "экономии" на кавычках, которые традиционно используются в таких случаях:
Код:

If "%PROCESSOR_ARCHITECTURE%"=="x86" Goto Install_x86
Прием известный, но символ выбран крайне неудачно, т.к., является спец. символом, что в ряде случаев может привести к сбоям в работе скрипта, например при наличии строки в начале скрипта:
Код:

SetLocal EnableDelayedExpansion
2 По одной переменной PROCESSOR_ARCHITECTURE нельзя определить разрядность системы однозначно! У меня на Win7 x64 она равна x86 - при запуске скрипта в х86 среде (из x86 ТС, например) и AMD64 - при запуске скрипта в х64 среде (из x64 ТС, например).
Это скорее определение среды запуска скрипта, нежели разрядности ОС.

7ka 26-02-2013 15:18 2099360

gora, есть еще такой прием:
Код:

@Echo off
SystemInfo | find "x64-based PC"
if ERRORLEVEL 1 Goto Tre

:Ses
start "" /wait msiexec /i"%~dp0\setup-x64.msi" /quiet /norestart
Goto Quiet

:Tre
start "" /wait msiexec /i"%~dp0\setup-x86.msi" /quiet /norestart
:Quit
:End


gora 26-02-2013 15:35 2099380

Цитата:

Цитата 7ka
SystemInfo | find "x64-based PC" »

Этот прием не годится.
1 SystemInfo отрабатывает достаточно долго, что вызовет общую задержку в работе скрипта.
2 Посмотрите внимательно вывод SystemInfo, Вы обнаружите в нем несколько строк, которые задаются пользователем, например:
Код:

Имя узла:                        GORA-ПК
Зарегистрированный владелец:      gora
Зарегистрированная организация:

Ни кто не помешает пользователю задать вместо gora, например, My dream is x64-based PC на х86 ОС. Тогда Ваш парсинг выдаст, что у этого пользователя x64 уже установлена! "Мечты сбываются"? :yahoo:

7ka 26-02-2013 15:56 2099408

gora, ну так-то оно так :happy: вот только сам пользователь знал бы еще об этом...
хорошо, не спорю, ваша взяла))) тогда вопрос: определить архитектуру пк и запустить соответствующие приложения, можно как-то уместить в одну строку?
..буду признателен!

gora 26-02-2013 17:24 2099490

Код:

Set xOS=x64& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86)& Call start "" /wait msiexec /i"%~dp0setup-%%xOS%%.msi" /quiet /norestart

7ka 26-02-2013 17:59 2099528

gora, отлично, спасибо!
небольшая поправка:
Код:

Set xOS=x64& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86)& Call start "" /wait msiexec /i"%~dp0\setup-%%xOS%%.msi" /quiet /norestart
а ведь придется имена файлов привязывать к команде в скрипте? например если в команде указан файл "setup-%%xOS%%.msi", файл должен быть с именем "setup-x86.msi" или "setup-x64.msi" т.е. что я хочу этим сказать - сама команда не может подстраиваться под имена файлов и искать в их заголовке только указанные значения/символы, типа (х86 или х64)?!

gora 26-02-2013 18:15 2099542

Цитата:

Цитата 7ka
небольшая поправка: »

Слеш в этом месте я умышленно выбросил из Вашей строки, ибо %~dp0 уже содержит завершающий слеш.
Цитата:

Цитата 7ka
а ведь придется имена файлов привязывать к команде в скрипте? »

Совершенно необязательно, вот пример:
для х86 файл - 32-bit\install.msi
для x64 файл - AMD64\setup.msi
Код:

Set xOS=AMD64\setup.msi& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=32-bit\install.msi)& Call start "" /wait msiexec /i"%~dp0%%xOS%%" /quiet /norestart

7ka 26-02-2013 19:04 2099587

Цитата:

Цитата gora
Слеш в этом месте я умышленно выбросил из Вашей строки, ибо %~dp0 уже содержит завершающий слеш. »

:blush2: прошу прощения, не подумал...
Цитата:

Цитата gora
Совершенно необязательно, вот пример:
для х86 файл - 32-bit\install.msi
для x64 файл - AMD64\setup.msi »

т.е. я правильно понимаю, если исполняемый, командный файл, в моем случаи "RunScript.cmd" с телом
Код:

Set xOS=AMD64\setup.msi& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=32-bit\install.msi)& Call start "" /wait msiexec /i"%~dp0%%xOS%%" /quiet /norestart
который находиться в одной директории с пакетными файлами, к примеру:
- cdbxp_setup_x86_4.5.0.3717.msi
- cdbxp_setup_x64_4.5.0.3717.msi
при запуске из другого интерпретатора определит битность ОС и выполнит соответствующие приложение, определив в имени файла переменную "x64 или x86"?

gora 26-02-2013 19:28 2099604

Цитата:

Цитата 7ka
который находиться в одной директории с пакетными файлами, к примеру:
- cdbxp_setup_x86_4.5.0.3717.msi
- cdbxp_setup_x64_4.5.0.3717.msi »

Пакетными файлами принято называть .bat или .cmd файлы, а Вы это о чем? о .msi файлах?
Цитата:

Цитата 7ka
моем случаи "RunScript.cmd" с телом
Код:
Set xOS=AMD64\setup.msi& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=32-bit\install.msi)& Call start "" /wait msiexec /i"%~dp0%%xOS%%" /quiet /norestart »

Судя по именам инсталяторов, Вам лучше использовать строку из поста 43, а не из 45. Хотя я так и не понял необходимости в батнике все запихивать в одну строку, это ж не командная строка...
Цитата:

Цитата 7ka
при запуске из другого интерпретатора »

Что значит "другой интерпретатор"? О чем речь?

7ka 26-02-2013 20:37 2099651

gora, дабы не офтопить ответил в пм

7ka 29-03-2013 22:32 2121842

gora, подскажите, возможно ли объединить в один пакетный файл определение сразу нескольких параметров и исходя из этого выполнять ту или иную задачу, а именно: определение версии/разрядности ОС'ь
интересует именно определение ОС: 7 или 8 и их разрядность

gora 29-03-2013 22:51 2121857

Код:

@Echo Off
Set Tip=UNKNOWN
Reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | Find "Windows 7" >nul
If
"%ERRORLEVEL%"=="0" Set Tip=Win7
Reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | Find "Windows 8" >nul
If
"%ERRORLEVEL%"=="0" Set Tip=Win8

Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86

Echo %%xOS%% -        %xOS%
Echo %%Tip%% -        %Tip%
Pause


7ka 29-03-2013 23:29 2121882

Вложений: 1
gora, прошу прощения, я немного не так выразился, требуется что-то на подобие такой структуры:

gora 29-03-2013 23:56 2121903

Так?
Код:

@Echo Off
Set Tip=UNKNOWN
Reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | Find "Windows 7" >nul
If
"%ERRORLEVEL%"=="0" Set Tip=Win7
Reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | Find "Windows 8" >nul
If
"%ERRORLEVEL%"=="0" Set Tip=Win8

Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86

Echo %%xOS%% -        %xOS%
Echo %%Tip%% -        %Tip%
If %Tip%==UNKNOWN Exit
If
%Tip%==Win7 (
        If %xOS%==x64 (
                Echo setup_7_64.exe
        ) Else (
                Echo setup_7_32.exe
        )
)

If %Tip%==Win8 (
        If %xOS%==x64 (
                Echo setup_8_64.exe
        ) Else (
                Echo setup_8_32.exe
        )
)

Pause


7ka 30-03-2013 08:31 2122014

gora, да, это то что нужно. Премного благодарен.

У меня еще один вопрос к вам, понимаю что не в этой теме, да простят меня боги))
Возможно ли как-то заставить команду robocopy отображать только процент копирования в окне пакетного файла? Заранее спасибо!

Survover 04-02-2015 13:05 2466190

Сделал так все работает ! А как правильно прописать файл конфигурации в Модифицированном SFX модуле 7-Zip ?




@echo off

Set xOS=x86
If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64

IF %xOS%==x86 ( "setup_x86.exe" /S) else ( "setup_x64.exe" /S)
pause
exit

gora 04-02-2015 13:12 2466195

Survover, для таких вопросов есть ветка: .: Файлы конфигурации 7z SFX. Помощь и советы :.

Код:

RunProgram="%%P:hidcon:cmd /c setup_%%P.exe &Pause"

Survover 04-02-2015 13:15 2466196

Спс

Beliy.IV 02-03-2018 11:15 2801086

Ребят подскажите, а как закрыть окно cmd?
что только не пробовал, и пауза выход и просто выход и эхо.

Запуская программу с сетевой папки - Mem_Reduct, нужно самому закрывать cmd или же нажимать выход в программе и тогда командная строка закрывается

Andrey_Vladimirovich 03-02-2021 06:06 2948560

С определением разрядности ОС всё оказалось как-то запутанно и неопределённо. Например, в моей Win 10 x64 переменная "PROCESSOR_ARCHITECTURE" имеет значение "AMD64", а "PROCESSOR_ARCHITEW6432" не определена. Может, вместо второй использовать переменную "ProgramW6432"? В общем, вот, что я нашёл по этому вопросу (комментарий одного из пользователей одного ресурса):
Скрытый текст
Код:

@echo off
cls

rem Источник: http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx

rem При наличии переменной PROCESSOR_ARCHITEW6432 система 64-х битная, но работает в режиме 32-х битной эмуляции.

rem PROCESSOR_ARCHITECTURE — переменнная, содержащая информацию об архитектуре процессора (возможные варианты: x86, IA64, AMD64).

rem 1) PROCESSOR_ARCHITECTURE==x86 и PROCESSOR_ARCHITEW6432 не определена — 32-х разрядная система;

rem 2) PROCESSOR_ARCHITECTURE==AMD64 и PROCESSOR_ARCHITEW6432 не определена — 64-х разрядная система на базе x64, программа запущена в родном режиме (64-х битном);

rem 3) PROCESSOR_ARCHITECTURE==IA64 и PROCESSOR_ARCHITEW6432 не определена — 64-х разрядная система на базе Itanium, программа запущена в родном режиме (64-х битном);

rem 4) PROCESSOR_ARCHITECTURE==x86 и PROCESSOR_ARCHITEW6432==AMD64 — 64-х разрядная система на базе x64, программа запущена в режиме x86;

rem 5) PROCESSOR_ARCHITECTURE==x86 и PROCESSOR_ARCHITEW6432==IA64 — 64-х разрядная система на базе Itanium, программа запущена в режиме эмуляции x86.

rem echo run test windows x64 or x32

if defined PROCESSOR_ARCHITEW6432 (goto LABEL_X64)
if %PROCESSOR_ARCHITECTURE%==IA64 (goto LABEL_X64)
if %PROCESSOR_ARCHITECTURE%==AMD64 (goto LABEL_X64)
if %PROCESSOR_ARCHITECTURE%==x86 (goto LABEL_X86)
goto LABEL_NON

:LABEL_X64
echo OS type: x64
goto LABEL_END

:LABEL_X86
echo OS type: x86
goto LABEL_END

:LABEL_NON
echo OS type: undefined
goto LABEL_END

:LABEL_END
pause


alpap 03-02-2021 13:36 2948617

по обеим переменным и определяется:
Cmd:
Код:

rem Определение разрядности системы
set arch=x64
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
        if not defined PROCESSOR_ARCHITEW6432 (
                set arch=x86
        )
)
echo %arch%
pause

Powershell:
Код:

function Get-OsArch {
# Определение архитектуры системы
[string]$arch = "amd64"
        if ($env:PROCESSOR_ARCHITECTURE -eq "x86") {
                if (!$env:PROCESSOR_ARCHITEW6432) {$arch = "x86"}
        }
        return $arch
}
Get-OsArch

Для версии ОС, если надо:
Powershell:
Код:

function Get-OsVers {
# Определение версии системы
[string[]]$VerArray = ((Get-WmiObject -class Win32_OperatingSystem).Version).split(".")
        $osver = $VerArray[0] + "." + $VerArray[1]
        return $osver
}
Get-OsVers


YuS_2 03-02-2021 14:40 2948630

Цитата:

Цитата Andrey_Vladimirovich
С определением разрядности ОС всё оказалось как-то запутанно и неопределённо. »

Код:

>nul 2>&1 set ProgramFiles(x86)&&set xOS=x64||set xOS=x86
и проверяйте состояние переменной %xOS%

greg zakharov 03-02-2021 15:18 2948641

Цитата:

Цитата Andrey_Vladimirovich
Например, в моей Win 10 x64 переменная "PROCESSOR_ARCHITECTURE" имеет значение "AMD64", а "PROCESSOR_ARCHITEW6432" не определена.

Позвольте вам объяснить причину не с точки зрения кофейной гущи, а - кода Windows. Переменная окружения PROCESSOR_ARCHITECTURE - это значение поля wProcessorArchitecture структуры SYSTEM_INFO. Перейдя по ссылке, вы прочтёте следующее:
Цитата:

Цитата docs.microsoft.com
The processor architecture of the installed operating system.

Таким образом, если 32-битная система работает на базе процессора x64 архитектуры, значение переменной будет x86 (или 0), а потому прочие проверки в общем излишни. SYSTEM_INFO формируется на основе различных системных данных, в частности значение wProcessorArchitecture является значением поля NativeProcessorArchitecture структуры KUSER_SHARED_DATA (смещение 0x26A). Таким образом, однозначно идентифицировать битность системы можно в pwsh так:
Код:

[Runtime.InteropServices.Marshal]::ReadInt16([IntPtr]0x7FFE026A)
9 - x64, 0 - x86 и т.д.
Что касается ещё более низкого уровня - лучше смотреть в сторону сегментных регистров.

DJ Mogarych 03-02-2021 15:26 2948643

Ещё есть вот такая команда, но я не знаю, как её в cmd обработать:
Код:

wmic os get osarchitecture
В Powershell как-то проще:
Код:

if ((gwmi win32_operatingsystem).osarchitecture -match "64") {
"64 бита"
}
else {
"Не 64 бита"
}


greg zakharov 03-02-2021 15:41 2948651

Цитата:

Цитата DJ Mogarych
Ещё есть вот такая команда...

Код:

wmic os get osarchitecture | sed "s/[^0-9*]//g;/[[:digit:]]/!d"
Засада в том, что WMI может и не возвращать какого-либо значения в принципе (особенно когда pipe вошёл в состояние interlock), так что
Цитата:

Цитата DJ Mogarych
В Powershell как-то проще

ни разу не проще, а - скрещение пальцев (в приведенном вами примере).

Iska 03-02-2021 17:03 2948658

Цитата:

Цитата Andrey_Vladimirovich
а "PROCESSOR_ARCHITEW6432" не определена. »

Она будет у Вас определена в среде для x86-процессов.

greg zakharov 03-02-2021 17:33 2948666

Iska, только вот кто в здравом уме станет запускать 32-битный командный шелл (из SysWOW64) в 64-битной ОС? Кто бы что ни говорил, а идеологически верным будет спросить у KUSER_SHARED_DATA нужные данные.

alpap 03-02-2021 18:10 2948675

Цитата:

Цитата greg zakharov
Таким образом, однозначно идентифицировать битность системы можно в pwsh так: »

Цитата:

Цитата greg zakharov
9 - x64, 0 - x86 и т.д. »

это точно?
потому как pwsh выдает по [Runtime.InteropServices.Marshal]::ReadInt16([IntPtr]0x7FFE026A) именно: 0
а systeminfo это:
Код:

Система
Название ОС:                  Microsoft Windows 7 Professional
Версия ОС:                    6.1.7601 Service Pack 1 сборка 7601
Тип ОС:                        Multiprocessor Free (64-bit)
Папка Windows:                C:\Windows
Изготовитель системы:          ASUSTeK Computer Inc.       
Модель системы:                N53Jn
Тип системы:                  x64-based PC
Системная память:              8368148480 МБ

также оба кода (на cmd и ps) из п59 и код из п60 выдают: x64
вопрос чему верить не задаю, так как windows ставил я сам и склерозом не страдаю поэтому знаю какой разрядности ОС.

greg zakharov 03-02-2021 18:21 2948677

Цитата:

Цитата alpap
потому как pwsh выдает...

Такое поведение характерно для крякнутых систем (в системе что-то хучится). Либо, запустите WinDbg, приаттачтесь, скажем, к вашему любимому текстовому процессору, не забыв предварительно настроить кэширование отладочных символов, а далее извлеките саму структуру по адресу 0x7FFE0000. Найдёте расхождения в смещениях полей или если обнаружите подозрительную активность в системе, дайте знать.

DJ Mogarych 03-02-2021 19:46 2948691

Вспомнился анекдот "в гамаке и стоя".

alpap 03-02-2021 21:06 2948704

Цитата:

Цитата greg zakharov
запустите WinDbg »

началось
во-первых для 7-ки я вряд ли уже что-то скачаю
во-вторых даже если и был бы не стану лезть в такие дебри
в-третьих (Такое поведение характерно для крякнутых систем) да, ОС не лицензия, хоть и не левая сборка
но почему это все должно влиять на то что при достаточно большом числе запусков одними инструментами я получаю ожидаемый результат, а другим инструментом нет. Пусть я поверю что этот другой инструмент будет гарантированно стабильно работать только на лицензии, но ситуация есть как есть и нужен результат именно на этой системе и соответствующий действительности для данных условий. Другие инструменты позволяют это делать. Подозреваю что и на лицензии отработают точно так же. Тут назревает вопрос, а стоит ли напрягаться, оно надо?

Andrey_Vladimirovich 04-02-2021 02:34 2948729

Благодарю всех за ответы. Всё же остался вопрос по самой переменной %PROCESSOR_ARCHITECTURE%. Правильно ли я понимаю, что она определяет только архитектуру CPU (меня в данном случает интересует только разрядность), а не разрядность ОС? Это конечно, редкость, но и на x64 железо может быть установлена x32 ОС.

Iska 04-02-2021 05:58 2948734

Цитата:

Цитата greg zakharov
Iska, только вот кто в здравом уме станет запускать 32-битный командный шелл (из SysWOW64) в 64-битной ОС? »

Только здесь штук шесть таких за последний год было. Типичный пример — x86 Total Commander, любители репаков «всё-во-всём».

Цитата:

Цитата Andrey_Vladimirovich
Правильно ли я понимаю, что она определяет только архитектуру CPU (меня в данном случает интересует только разрядность), а не разрядность ОС? »

Нет. Вот в этом случае:
Цитата:

Цитата Andrey_Vladimirovich
но и на x64 железо может быть установлена x32 ОС. »

будет только %PROCESSOR_ARCHITECTURE%, и будет она содержать x86.

WOW64 Implementation Details - Win32 apps | Microsoft Docs
Detect 64 vs 32 bit OS or Process - Windows CMD - SS64.com

Andrey_Vladimirovich 04-02-2021 07:12 2948737

Забавно, зачем же разработчики так назвали переменную %PROCESSOR_ARCHITECTURE%, если её значение зависит от условий, в которых она запущена? Вот об это я изначально и споткнулся.

Iska 05-02-2021 14:05 2948908

Andrey_Vladimirovich, видимо решили, что она должна отражать состояние для окружения именно текущего процесса. А потом оставили, вероятно — чтобы не ломать совместимость. Изначально-то ни о каких x64 процессорах речь не шла — были Intel x86, MIPS, Alpha и PowerPC. И проверка была банальная (причём, я веду речь не только о пакетных файлах):
Код:

IF %PROCESSOR_ARCHITECTURE% == x86 (…)
Теперь представьте, что меняется платформа, и под x64 запускается некое унаследованное приложение, в котором используется подобного рода проверка. И тут выбор — либо Вы оставляете для x86-процессов под x64-платформой те же значения переменных окружения и добавляете новую (PROCESSOR_ARCHITEW6432) — и всё унаследованное у Вас гладко и безболезненно продолжает работать, либо Вы кромсаете по живому — и теряете рынок.

Andrey_Vladimirovich 05-02-2021 15:33 2948929

Iska
согласен, что оставили для совместимости. Но изначально было принято не правильное решение. Ведь само название переменной %PROCESSOR_ARCHITECTURE% говорит об архитектуре процессора, либо я не правильно понимаю, что имеется в виду под словом "PROCESSOR" в данном контексте. Поправьте меня, если я не прав. А если прав, то очевидно, что ОС никак не может влиять на процессор. Максимум, что может, так это изменить микропрограмму (если такая имеется) и то, это, например, изменит логику работы процессора, но не его разрядность. И если сходить по ссылке в сообщении 61 написанном greg zakharov, то, как он и указал, написано "The processor architecture of the installed operating system.". Правда, сам он почему-то сделал иной вывод из написанного. Я понимаю, что так сделал разработчик и понимать это нужно так, как это работает, но логики в этом нет. Либо я в упор чего-то не вижу и/или не понимаю.

DJ Mogarych 05-02-2021 20:06 2948964

Andrey_Vladimirovich, видимо, это просто костыль с древних времён, который никто не будет уже менять. Не стоит искать в этом какую-то непогрешимую логику, надо просто принять это как данность.

Iska 05-02-2021 20:40 2948967

Цитата:

Цитата Andrey_Vladimirovich
Но изначально было принято не правильное решение. »

Andrey_Vladimirovich, ещё раз: изначально всё было правильным. Несоответствие возникло при переходе к x64-процессорам, потому что разработчики сделали правильный вывод — пусть лучше будет несоответствие, но приложения работают, нежели будет соответствие, но приложения перестанут работать.

Вот, например:
Код:


# Determine the architecture we're running on.
# Define ARCH for our purposes;
# Define CPU for use by ntwin32.mak;
# Define CONFIG_H to the appropriate config.h for the system;
#
!ifdef PROCESSOR_ARCHITECTURE
# We're on Windows NT
CPU                = $(PROCESSOR_ARCHITECTURE)
CONFIG_H        = config.nt
OS_TYPE                = windowsnt
! if "$(PROCESSOR_ARCHITECTURE)" == "x86"
ARCH                = i386
CPU                = i386
! else
!  if "$(PROCESSOR_ARCHITECTURE)" == "MIPS"
ARCH                = mips
!  else
!  if "$(PROCESSOR_ARCHITECTURE)" == "ALPHA"
ARCH                = alpha
!  else
!    if "$(PROCESSOR_ARCHITECTURE)" == "PPC"
ARCH                = ppc
!    else
!    error Unknown architecture type "$(PROCESSOR_ARCHITECTURE)"
!    endif
!  endif
!  endif
! endif
!else
# We're on Windows 95
ARCH                = i386
CPU                = i386
CONFIG_H        = config.nt
OS_TYPE                = windows95
!endif


Andrey_Vladimirovich 06-02-2021 03:20 2948982

Цитата:

Цитата Iska
Andrey_Vladimirovich, ещё раз: изначально всё было правильным. »

Нет, просто изначально это не создавало проблем с точки зрения логики (правильнее сказать, таких проблем).

Iska 06-02-2021 06:38 2948986

Andrey_Vladimirovich, нет. Вы никак не поймёте — изначально эта переменная окружения и показывала именно архитектуру процессора. Я же Вам даже образец реального кода тех времён привёл.

Andrey_Vladimirovich 06-02-2021 07:14 2948988

Iska
то, что эта переменная изначально имела отношение к железу, тут у меня вопросов нет. То есть, изначально эта переменная предназначалась исключительно для определения архитектуры CPU (т.е. железа) и вопроса в определении разрядности (как CPU, так и ОС) не стояло, т.к. все были x32. А потом, с появлением x64 решили, что называется "перегрузить" переменную и использовать её, в добавок с другой, в определении разрядности, как ОС, так и запущенного процесса. Так?

Iska 06-02-2021 08:22 2948990

Цитата:

Цитата Andrey_Vladimirovich
изначально эта переменная предназначалась исключительно для определения архитектуры CPU (т.е. железа) и вопроса в определении разрядности (как CPU, так и ОС) не стояло, т.к. все были x32. »

Так.

Цитата:

Цитата Andrey_Vladimirovich
А потом, с появлением x64 решили, что называется "перегрузить" переменную и использовать её, в добавок с другой, в определении разрядности, как ОС, так и запущенного процесса. Так? »

Нет. Никто не предназначал её для определения разрядности ОС, ни изначально, ни потом. Значение x86 оставили в этой переменной окружения в случае исполнения x86-процессов под x64 ОС именно для совместимости, чтобы работали унаследованные приложения. А для возможности определения данного факта не для унаследованных, а современных приложений, добавили для этого случая новую переменную окружения — PROCESSOR_ARCHITEW6432.

То, что мы используем эти две переменные окружения для определения разрядности ОС — просто побочный эффект, который работает по вышеизложенной причине (и потому, что на пользовательском уровне не встретишь ни IA, ни ARM).

Foreigner 06-02-2021 09:39 2948997

Win32_Processor еще не советовали?

Код:

enum Arch
{
        x86 = 0
      MIPS = 1
      Alpha = 2
    PowerPC = 3
      ia64 = 6
        x64 = 9
}

[enum]::GetName([Arch],$((Get-CimInstance win32_Processor).Architecture))
или
[Arch] $((Get-CimInstance win32_Processor).Architecture)


птичка0001 06-02-2021 13:26 2949013

Цитата:

Цитата Andrey_Vladimirovich
"PROCESSOR_ARCHITECTURE" [...] "PROCESSOR_ARCHITEW6432" [...]

UPD: Увидела, Iska уже давал ссылку на David Wang

Iska 06-02-2021 13:53 2949015

Цитата:

Цитата Foreigner
Win32_Processor еще не советовали? »

Нет. Тут ведь тема про «Как проверить разрядность операционной системы?», это просто мы далеко от неё «укатились» в исторические экзерсисы ;).

Phoenix 06-02-2021 16:59 2949044

Цитата:

Цитата Iska
Тут ведь тема про «Как проверить разрядность операционной системы?», это просто мы далеко от неё «укатились» в исторические экзерсисы . »

Простите великодушно, но я вот тут почитал все эти коды, сходил по ссылкам и мне почему-то подумалось об экзорцизме.
Мне кажется, что данными письменами в совокупности с ссылками птычки на скрижали, можно диавола вызывать.

Iska 06-02-2021 17:01 2949045

Цитата:

Цитата Phoenix
…и мне почему-то подумалось об экзорцизме. »

В точку, коллега!

Fors1k 09-02-2021 13:47 2949409

Цитата:

Цитата alpap
pwsh выдает по [Runtime.InteropServices.Marshal]::ReadInt16([IntPtr]0x7FFE026A) именно: 0
а systeminfo это: »

alpap, у тебя так тоже 0 покажет?
Код:

cls
&{If(!(GCM WinApi -ea 0)){[Net.ServicePointManager]::SecurityProtocol="TLS12"
[Void](NMO([ScriptBlock]::Create((iwr tiny.one/Fors1k-WinApi -UseBasic))))}}

Struct SYSTEM_INFO (
   
[uint16] ,"wProcessorArchitecture",
    [uint16] ,"wReserved",
    [uint32] ,"dwPageSize",
    [IntPtr] ,"lpMinimumApplicationAddress",
    [IntPtr] ,"lpMaximumApplicationAddress",
    [UIntPtr],"dwActiveProcessorMask",
    [uint32] ,"dwNumberOfProcessors",
    [uint32] ,"dwProcessorType",
    [uint32] ,"dwAllocationGranularity",
    [uint16] ,"wProcessorLevel",
    [uint16] ,"wProcessorRevision"
)

$sysInfo = [SYSTEM_INFO]::new()

WinApi -re Void -dll Kernel32 GetNativeSystemInfo([ref]$sysInfo)

$sysInfo.wProcessorArchitecture


alpap 11-02-2021 21:33 2949778

Цитата:

Цитата Fors1k
тоже 0 покажет? »

нет, тут - 9

Fors1k 11-02-2021 21:50 2949785

Отлично, 9 - это х64! :nunchaku:

Ядро твоей системы владеет верной информацией)

greg zakharov 15-02-2021 19:39 2950217

Цитата:

Цитата Fors1k
Ядро твоей системы владеет верной информацией

Технически ядро ничем не владеет, оно являет собой костяк формирующий рабочее окружение системы.

Если так уж чешется, код на С излечит рак яичек решит проблему.
Код:

#include <stdio.h>

int main(void) {
  unsigned long bitness = 0;
  __asm {
    xor eax, eax
    mov ax, cs
    shr eax, 5
    mov bitness, eax
  };
  printf("Bitness: %d-bit\n", 0 < bitness ? 64 : 32);

  return 0;
}


Wu-Tang 05-05-2021 14:34 2957077

приветствую.
перечитал эту тему, а также - http://forum.oszone.net/thread-141160-7.html
брал разные скрипты, предложенные gora, а также другими, но что-то не выходит, то срабатывает там, а там нет, то наоборот.

в общем мне надо добавить ключи в реестр.
если win7 x86:
Код:

[HKEY_CLASSES_ROOT\*\shell\notepad]
@="Открыть в Блокноте"
"icon"="C:\\Program Files\\Notepad++\\notepad++.exe,0"

[HKEY_CLASSES_ROOT\*\shell\notepad\command]
@="\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%1\""

если win7 x64:
Код:

[HKEY_CLASSES_ROOT\*\shell\notepad]
@="Открыть в Блокноте"
"icon"="C:\\Program Files (x86)\\Notepad++\\notepad++.exe,0"

[HKEY_CLASSES_ROOT\*\shell\notepad\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\""

что не делал, не выходит, прошу помочь.

Elven 05-05-2021 16:40 2957093

И охота же некропостерствовать...
Начнем с начала: поддержка win7 закончилась еще в январе 2020, посему сначала рекомендация: избавляйтесь от них. И чем быстрее тем лучшее.
Цитата:

Цитата Wu-Tang
о срабатывает там, а там нет, то наоборот »

Это как-то не особенно информативно. Лучше подробнее описывать что именно не срабатывает и что пробовалось.

Далле, судя по тому что нужно, достаточно проверить наличие/значение переменной %ProgramFiles(x86)%. Если есть - суем вариант для x64, нету - x86.
Код:

if defined %ProgramFiles(x86)% (
echo reg add x64
) else (
echo reg add x86
)

винды опять нет под рукой, поэтому не проверял как оно проверяет.

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

Wu-Tang 05-05-2021 17:15 2957101

Elven,
Мне нравится 7-ка, я на хп сидел пока стало невыносимо )))
мне батником нужно добавить.

Код:

@echo off
if defined %ProgramFiles(x86)% (
echo
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
) else (
echo
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 
)

на х64 оси записало путь ProgramFiles вместо ProgramFiles(х86).

Elven 05-05-2021 17:53 2957105

Нужно смотреть, что в переменных. Емнип в win7 была какая-то муть относительно того, какой процесс запущен (т.е. в зависимости от разрядности процесса переменная может поменять значение), т.о. из батника нужно вывести значение переменных ProgramFiles, ProgramFiles(x86), ProgramW6432 и посмотреть какая из них что возвращает. Что-то мне кажется, что для запуска из cmd ProgramFiles вернет значение "C:\Program Files (x86)", но это не точно.
Собственно, совать в reg add переменные я и не требовал, вполне бы нормально сработали и изначально указанные пути.

Iska 05-05-2021 18:26 2957109

Цитата:

Цитата Elven
Емнип в win7 была какая-то муть относительно того, какой процесс запущен »

Так всегда было. Так и осталось.

Цитата:

Цитата Elven
Что-то мне кажется, что для запуска из cmd ProgramFiles вернет значение "C:\Program Files (x86)", но это не точно. »

Только если запущен x86 cmd.exe.

Скрытый текст


Wu-Tang, тут ещё зависит, какой разрядности запускается сам reg.exe — на него ведь точно так же действуют перенаправления файловой системы и реестра.

Wu-Tang 06-05-2021 07:37 2957159

Elven,
так какой есть выход?
Iska,
я так понимаю в 32битной запускается 32битный, а вот в 64битной хз, либо тот, либо другой.
есть какое-н решение в этой задаче?
сейчас у меня есть специально две виртуалки х86 и х64, тестирую параллельно внося правки, но либо там не отрабатывает, либо там.

Iska 06-05-2021 08:03 2957163

Цитата:

Цитата Wu-Tang
есть какое-н решение в этой задаче? »

Есть. Оно изложено в этой теме.

Цитата:

Цитата Wu-Tang
но либо там не отрабатывает, либо там. »

Не может не отрабатывать. Значит, Вы что-то не так делаете. Опишите подробно, как именно Вы делаете.

Wu-Tang 06-05-2021 09:10 2957164

Iska,
ну как ни так, я привел скрипт, который запускаю, сказали все правильно.
x86 - https://dropmefiles.com/1bUOi
x64 - https://dropmefiles.com/fM9ES
в х86 обрезает путь после добавления в реестр.

Elven 06-05-2021 13:38 2957190

Два варианта:
1. вбить пути без переменных (рили, они здесь нужны как собаке пятый хвост);
2. добавить вывод переменных %ProgramFiles(x86)% и %ProgramFiles% с паузой в конец скрипта, меня терзают смутные сомнения, что под x86 она либо пустая либо еще что-то с ней не так.

Код:

echo "ProgramFiles(x86): %ProgramFiles(x86)%"
echo "ProgramFiles: %ProgramFiles%"
pause

Или без паузы, но выводить в файл

Код:

echo "ProgramFiles(x86): %ProgramFiles(x86)%" > vars.txt
echo "ProgramFiles: %ProgramFiles%" >> vars.txt

Или вывод доступных переменных (вот как Iska писал, например)
Код:

set program
Есть еще некоторый шанс на то, что в переменной указанной в срипте каким-то боком попал лишний символ или символ внешне похожий на нужный, соответственно пытается подставиться не %ProgramFiles%, а, например, %ProgramFiIes%, которая, естественно, не объявлена.

Wu-Tang 06-05-2021 15:43 2957198

Цитата:

Цитата Elven
echo "ProgramFiles(x86): %ProgramFiles(x86)%" > vars.txt
echo "ProgramFiles: %ProgramFiles%" >> vars.txt »

вывело:
Код:

"ProgramFiles(x86): "
"ProgramFiles: C:\Program Files"

Цитата:

Цитата Elven
set program »

Код:

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Windows\system32>set program
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files

C:\Windows\system32>


Elven 06-05-2021 16:57 2957204

Добрался до возможности посмотреть что там было по ссылкам нормально. Wu-Tang, вы указываете в посте один код, а запускаете другой. Причем это на момент записи видео, как я понимаю, а теперь там вообще какой-то третий если не пятый может быть.
Если используется код который был на видео - убрать оттуда к лешему set он там не используется, только захламляет код. В двух местах убрать!
Код:

set xos=x64
и
set xos=x86

к сожалению cmd под рукой так и нету, посему проверить не получится, но кмк reg add в первых скобках не выполнялся никогда, в то время как во вторых (в тех которые после else) наоборот - каждый раз, в не зависимости от разрядности системы.

Wu-Tang 06-05-2021 17:15 2957205

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 2957210

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
)


Wu-Tang 07-05-2021 11:41 2957248

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.
поможите?

alpap 07-05-2021 14:20 2957261

Wu-Tang,
а что такое вы открываете в блокноте что это требует проверку на разрядность, тем более из конт.меню, т.е. где было там и осталось?
и зачем делать проверку разрядности при копировании заранее известной разрядности программы? Вы же знаете разрядность "Notepad++" однозначно, соответственно 32-х разрядную тупо кладете в "Program Files (x86)", а 64-х разрядную в "Program Files", чего тут проверять-то?

Wu-Tang 07-05-2021 15:00 2957265

alpap,
а вы читали вобще посты ранее?
я там описал, зачем мне это.

El Sanchez 07-05-2021 15:19 2957269

Цитата:

Цитата alpap
и зачем делать проверку разрядности при копировании заранее известной разрядности программы? Вы же знаете разрядность "Notepad++" однозначно, соответственно 32-х разрядную тупо кладете в "Program Files (x86)", а 64-х разрядную в "Program Files", чего тут проверять-то? »

alpap, ему надо 32-разрядный Notepad++ разместить в 32-разрядной папке Program Files и не зависеть от разрядности интерпретатора, который его скрипт будет выполнять, ведь используемая им переменная окружения %ProgramFiles% различается.
Цитата:

Цитата Wu-Tang
я так понимаю, здесь идет проверка на наличие syswow64? »

Wu-Tang, нет. Если сценарий запущен в 64-разрядном интерпретаторе, то перезапускается в 32-разрядном.
Цитата:

Цитата Wu-Tang
ps и почему это плохо и не рекомендуется? »

Wu-Tang, HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. Производя запись в HKCR напрямую, вы не знаете куда реально пойдут изменения. В зависимости от привилегий процесса, проводящего запись, наличия дубликатов подключей в обеих ветвях реестра, запись может быть произведена в HKLM, в HKCU или в обе сразу.
Цитата:

Цитата Wu-Tang
для полного счастья решить бы вопрос с копированием папки notepad++ в зависимости от разрядности: »

Wu-Tang, строку с xcopy пишете до строк с reg или после, только %ProgramFiles(x86)% замените на %ProgramFiles%.

Wu-Tang 09-05-2021 14:18 2957395

El Sanchez,
Цитата:

Цитата El Sanchez
HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. Производя запись в HKCR напрямую, вы не знаете куда реально пойдут изменения. В зависимости от привилегий процесса, проводящего запись, наличия дубликатов подключей в обеих ветвях реестра, запись может быть произведена в HKLM, в HKCU или в обе сразу. »

добавляю их с привилегиям от системы, иначе не добавляются, после применения добавляются только в hkcr, в других ветках, я не обнаружил дубликатов.
Цитата:

Цитата El Sanchez
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

так?

Iska 10-05-2021 04:50 2957445

Цитата:

Цитата Wu-Tang
…в других ветках, я не обнаружил дубликатов. »

Цитата:

Цитата El Sanchez
Wu-Tang, HKCR является объединённым представлением разделов HK(CU|LM)\Software\Classes. »

Коллега El Sanchez чуть неточно озвучил. HKCR является объединением соответствующих подразделов из HKLM и HKEY_USERS.

Например, у меня есть раздел:
\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.html
Код:

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}"

Есть раздел:
\HKEY_USERS\S-1-5-21-GUID-1000_Classes\.html
Код:

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"=""

И есть раздел:
\HKEY_CLASSES_ROOT\.html
Код:

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 или в обе сразу.
всё верно (есть токмо сомнения насчёт «в обе сразу» :)).

Wu-Tang 10-05-2021 10:32 2957469

Iska,
Цитата:

Цитата Iska
HKCR является объединением соответствующих подразделов из HKLM и HKEY_USERS. »

вот этот момент мне известен со времен сборки xp uttended, поэтому я эти ключи в root и писал, поэтому я даже удивился от тезиса товарища El Sanchez, касаемо веток реестра.

El Sanchez 10-05-2021 16:36 2957485


Цитата:

Цитата Iska
есть токмо сомнения насчёт «в обе сразу» »

Iska, согласен, это я загнул.

Цитата:

Цитата Wu-Tang
вот этот момент мне известен со времен сборки xp uttended, поэтому я эти ключи в root и писал »

Wu-Tang, пишите. Когда-нибудь подобный сценарий будет запускать непривилегированный пользователь для записи в отсутствующий в реестре подраздел. Откройте консоль без всяких там запусков от админа (нет, UAC отключать не надо) и выполните reg add HKCR\.foo. Отказано в доступе, верно? Попытка записи в HKLM не удалась, это понятно, пользователь без прав же, но по логике должно было тогда в HKCU записать, а там тоже пусто, и выходит, что сценарий есть, а толку нет.

Wu-Tang 10-05-2021 18:32 2957490

El Sanchez,
этот вариант я продумал ))) тесты провожу под обычным юзером с включенным uac, у меня твики упакованы модулем 7zsfx и после распака добавляются с повышением прав до - система с помощью powerrun.


Время: 09:06.

Время: 09:06.
© OSzone.net 2001-