批处理文件-运行附加到PATH的安装程序,并从bat运行该新应用程序

时间:2018-09-18 09:32:34

标签: ruby batch-file

我正在尝试设置一个依赖于“ gem”的批处理文件,该文件是Ruby的软件包管理器。基本上,我们想运行这样的东西:

gem install cucumber -v 2.4.0

if %errorlevel% == 9009 (
  rubyinstaller-2.5.1-2-x64.exe
  gem install cucumber -v 2.4.0
)

基本上,如果您没有安装gem,则输出如下:

C:\workspace\3rdparty-svn\CucumberCpp>gem install cucumber -v 2.4.0
'gem' is not recognized as an internal or external command,
operable program or batch file.

C:\workspace\3rdparty-svn\CucumberCpp>if 9009 == 9009 (
rubyinstaller-2.5.1-2-x64.exe
 gem install cucumber -v 2.4.0
)
'gem' is not recognized as an internal or external command,
operable program or batch file.

C:\workspace\3rdparty-svn\CucumberCpp>pause

if检查是否存在gem,如果不存在,则安装ruby,然后再次运行gem。 问题在于这不起作用,因为它们都在命令提示符的同一实例中运行,并且似乎不知道rubyinstaller设置的新PATH。

是否可以使用批处理文件来执行此操作?当然,如果我再次运行批处理文件,则可以检测到gem,它将能够运行第一个命令,然后当然可以跳过if语句。

1 个答案:

答案 0 :(得分:0)

@echo off
setlocal

rem Install Cucumber
2>nul gem install cucumber -v 2.4.0

if %errorlevel% neq 9009 (
    echo Cucumber install did not error code 9009.
    exit /b 0
)

rem Get Ruby path.
call :query_rubypath

if errorlevel 1 (
    echo Installing Ruby.
    rubyinstaller-2.5.1-2-x64.exe /verysilent
    call :query_rubypath
)

rem Update PATH
if defined rubypath (
    if "%path:~-1%" == ";" (
        set "path=%path%%rubypath%\bin"
    ) else set "path=%path%;%rubypath%\bin"
) else (
    >&2 echo Ruby path not found.
    exit /b 1
)

rem Use command gem or command "%rubypath%\bin\gem"
@rem "%rubypath%\bin\gem" install cucumber -v 2.4.0
gem install cucumber -v 2.4.0

if %errorlevel% == 9009 (
    >&2 echo Cucumber error code 9009.
    exit /b 1
)

exit /b

:query_rubypath
rem Get Ruby path from registry
set "rubypath="

for /f "tokens=1,2,*" %%A in ('
 reg query HKCU\Software\RubyInstaller\MRI\2.5.1
 /v InstallLocation
 2^>nul
') do if /i "%%~A" == "InstallLocation" set "rubypath=%%~C"

if not defined rubypath exit /b 1
exit /b 0

安装程序rubyinstaller-2.5.1-2-x64.exe编译为 Inno Setup version 5.5.9 (u)

安装可以由Setup Command Line Parameters处理。

默认情况下,组件ruby被选中,msys2被取消选中。 如果重新安装,安装程序将读取卸载条目 确定要选择的已安装组件的状态 如果未指定/COMPONENTS参数。

如果是无人值守安装,则可以使用例如:

rubyinstaller-2.5.1-2-x64.exe /verysilent /COMPONENTS="ruby,msys2"

/COMPONENTS参数是可选的。

PATH环境变量更新为:

  

C:\ Ruby25-x64 \ bin

这将是%systemdrive%上的默认安装路径。 该脚本将从注册表中找到实际路径。

位于的重要注册表项是:

HKEY_CURRENT_USER\Software\RubyInstaller\MRI\2.5.1
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\RubyInstaller-2.5-x64-mingw32_is1

call :query_rubypath的代码将获取Ruby的安装路径。 如果定义,名为rubypath的变量将存储该值。

如前所述,

如何安装 Ruby 是首选。 无论哪种方式,脚本都将处理许多基本处理。

  • 该脚本将找到安装路径,因此 gem命令可以执行。
  • 如果找不到安装路径,将安装Ruby。

如果即使已找到安装路径,也要安装Ruby, 然后删除if errorlevel 1条件。进行如下更改 您的环境所需。