Как установить 32-разрядный или 64-разрядный исполняемый файл, если исполняемый файл еще не существует? - PullRequest
0 голосов
/ 26 октября 2018

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

Может кто-нибудь, пожалуйста, помогите?

@echo on
if /i "%processor_architecture%"=="x86" (
    if exist "C:\Program Files\Credential Wizard\CredentialWizard.exe" (
        echo ***App is Installed Successfully***
    ) else (\\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\nam-creds-provider-windows-x86-2.0.4.exe -q)
) else if /i "%processor_architecture%"=="X64" (
    if exist "C:\Program Files (x86)\Credential Wizard\CredentialWizard.exe" (
        echo ***App is Installed Successfully***
    ) else (\\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\nam-creds-provider-windows-x64-2.0.4.exe -q)
)
exit

Или этот

@echo off

Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
REG.exe Query %RegQry%  | Find /i "x86" 
If %ERRORLEVEL% == 0 (
    GOTO X86
) ELSE (
    GOTO X64
)

:X86
IF NOT EXIST "C:\Program Files\Credential Wizard\CredentialWizard.exe"(start \\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\nam-creds-provider-windows-x86-2.0.4.exe -q)
GOTO END

:X64
IF NOT EXIST "C:\Program Files (x86)\Credential Wizard\CredentialWizard.exe"(start \\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\nam-creds-provider-windows-x64-2.0.4.exe -q)
:End
exit

1 Ответ

0 голосов
/ 26 октября 2018

Предлагаю прочитать статьи Microsoft

Пакетный файл может быть выполнен в Windows x64 с помощью cmd.exe в каталоге

  • %SystemRoot%\System32 (x64) или
  • %SystemRoot%\SysWOW64 (x86)

Какой cmd.exe используется, зависит от архитектуры приложения, вызывающего пакетный файл.Исполняемый файл установщика x86, выполняющий пакетный файл, приводит к интерпретации командного файла командным процессором Windows x86, поэтому пакетный файл выполняется в 32-разрядной среде, как в Windows x86, даже при выполнении в Windows x64.

ДляПо этой причине командный файл, используемый для установки приложения x86 или x64, всегда должен сначала выяснить, в какой среде оно выполняется в какой операционной системе.

Кроме того, не имеет значения, какая архитектура является ЦП ПКесть.Это может быть процессор x64, но тем не менее установлена ​​Windows x86.В этом случае невозможно использовать приложения x64, хотя ЦП будет их поддерживать, поскольку установленная Windows не поддерживает их.

Существуют и другие факты, которые необходимо учитывать:

  1. Существуют ли разделы реестра, созданные во время установки, на которые влияет WOW64?
    В этом случае было бы лучше, чтобы пакетный файл, выполняемый в настоящее время в среде x86, в Windows x64 был запущен снова в среде x64.перед установкой.

  2. Выполняется ли пакетный файл приложением-установщиком, которое немедленно продолжается cmd.exe, завершив выполнение пакетного файла?
    В этом случае необходимо, чтобы32-разрядное cmd.exe выполнение пакетного файла приостанавливается до тех пор, пока 64-разрядное cmd.exe не завершит выполнение пакетного файла в 64-разрядной среде в Windows x64 и не завершит работу, ничего не делая в 32-разрядной среде.

Я предлагаю использовать этот пакетный файл для вашей задачи:

@echo off
rem Is the batch file executed by 32-bit cmd.exe on Windows x86?
if "%ProgramFiles(x86)%" == "" goto DoInstall

rem Is the batch file executed by 64-bit cmd.exe on Windows x64?
if not exist "%SystemRoot%\Sysnative\cmd.exe" goto DoInstall

rem Run this batch file by 64-bit instead of 32-bit cmd.exe on Windows x64.
rem This simple method works only if batch file is executed without arguments.
"%SystemRoot%\Sysnative\cmd.exe" /C "%~f0"

rem Exit batch file executed by 32-bit cmd.exe on Windows x64
rem after 64-bit cmd.exe finished execution of the batch file.
goto EndBatch

:DoInstall
rem echo Processor architecture:  %PROCESSOR_ARCHITECTURE%
rem echo Program files directory: %ProgramFiles%
rem echo Common program files:    %CommonProgramFiles%

if exist "%ProgramFiles%\Credential Wizard\CredentialWizard.exe" goto Installed
if not "%ProgramFiles(x86)%" == "" if exist "%ProgramFiles(x86)%\Credential Wizard\CredentialWizard.exe" goto Installed

rem When \\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\
rem contains always just one installer executable for x86 and one for
rem for x64, let the batch file use that one independent on its version
rem number in file name.
for %%I in ("\\srvfs01.flymyrtlebeach.com\deployment$\Software\Nervepoint\nam-creds-provider-windows-%PROCESSOR_ARCHITECTURE%-*.exe") do (
    copy /V "%%I" "%TEMP%\%%~nxI"
    "%TEMP%\%%~nxI" -q
    del "%TEMP%\%%~nxI"
    goto ReCheck
)

:ReCheck
if exist "%ProgramFiles%\Credential Wizard\CredentialWizard.exe" goto Installed
if not "%ProgramFiles(x86)%" == "" if exist "%ProgramFiles(x86)%\Credential Wizard\CredentialWizard.exe" goto Installed

echo === ERROR: App installation failed. ===
echo/
pause
goto EndBatch

:Installed
echo *** App is installed successfully. ***

:EndBatch

Нетte: Я добавил цикл FOR для запуска nam-creds-provider-windows-x86-2.0.4.exe или nam-creds-provider-windows-x64-2.0.4.exe или любого другого nam-creds-provider-windows-x*-*.exe в случае, если версия 2.0.4 исполняемого файла когда-либо заменяется более новой версией.

Пакетный файл работает даже с отключенными расширениями команд.

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

  • cmd /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?

PS: запуск %SystemRoot%\System32\cmd.exe, например, сдважды щелкните по этому файлу и запустите set pro.Разрешите открывать и запускать окно 64-разрядной командной строки из Windows Explorer %SystemRoot%\SysWOW64\cmd.exe, также дважды щелкнув этот файл, и запустить set pro в окне 32-разрядной командной строки.Сравните выходные переменные среды в обоих окнах командной строки.

...