如果可执行文件尚不存在,如何安装 32 位或 64 位可执行文件?

How to install 32-bit or 64-bit executable if executable does not already exist?

在检查了正确的处理器类型后,我尝试了两种脚本变体来安装可执行文件。我相信可执行文件运行,但由于某种原因它无法检查文件是否已经存在。我会post都在这里。

有人可以帮忙吗?

@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[=11=]
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

我建议阅读 Microsoft 文档页面

批处理文件可以在目录

中由cmd.exe在64位Windows上执行
  • %SystemRoot%\System32 (x64) 或
  • %SystemRoot%\SysWOW64 (x86)

使用哪个cmd.exe取决于调用批处理文件的应用程序的体系结构。一个 32 位安装程序可执行文件 运行 批处理文件导致批处理文件被 32 位 Windows 命令处理器解释,因此批处理文件 运行s 在 32 位环境中如在 32 位 Windows 上甚至在 64 位 Windows.

上执行

出于这个原因,用于安装 32 位或 64 位应用程序的批处理文件需要始终首先找出它在哪个环境中由哪个操作系统执行。

此外,PC CPU 的架构无关紧要。它可以是 x64 处理器,但安装的仍然是 32 位 Windows。在这种情况下,无法使用 64 位应用程序,尽管 CPU 会支持它们,因为安装的 Windows 不支持它们。

还有一些必须考虑的其他事实:

  1. 是否有在安装过程中创建的受 WOW64 影响的注册表项?
    在这种情况下,当前在 64- 32 位环境中执行的批处理文件会更好位 Windows 在执行安装之前在 64 位环境中再次启动。

  2. 安装程序执行的批处理文件是否在 cmd.exe 后立即继续执行批处理文件?
    在这种情况下,批处理文件的执行是必要的32 位 cmd.exe 暂停,直到 64 位 cmd.exe 在 64 位 Windows 上完成批处理文件在 64 位环境中的执行,然后退出而不在 32 位中执行任何操作环境。

我建议使用这个批处理文件来完成你的任务:

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

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

rem Run this batch file by 64-bit instead of 32-bit cmd.exe on 64-bit Windows.
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 64-bit Windows
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 32-bit and one for
rem for 64-bit, 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

注意: 我在 运行 nam-creds-provider-windows-x86-2.0.4.exenam-creds-provider-windows-x64-2.0.4.exe 中添加了一个 FOR 循环或任何其他 nam-creds-provider-windows-x*-*.exe 在可执行文件的版本 2.0.4 被更新版本替换的情况下。

批处理文件即使在禁用命令扩展的情况下也能正常工作。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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

PS: 运行 %SystemRoot%\System32\cmd.exe 例如双击此文件和 运行 set pro。让 64 位命令提示符 window 打开并从 Windows Explorer %SystemRoot%\SysWOW64\cmd.exe 接下来 运行 也双击此文件并 运行 set pro 在 32 位命令提示符下 window。比较两个命令提示符中的输出环境变量 windows.