if-else和命令提示符中的错误处理

时间:2015-03-04 01:29:15

标签: shell powershell cmd gem appveyor

我正在尝试检测是否未安装某个ruby gem,先安装然后继续。

例如:

gem which rails

返回.rb上gem的驱动程序文件(stdout)的路径,如果gem存在,如果不存在则检查stderr上的抛出错误。

我该如何解决?

伪代码:

if throws "gem which example1" ( gem install example1 )
if throws "gem which example2" ( gem install example2 )
if throws "gem which example3" ( gem install example3 )

:: install other stuff

cmd或powershell都可以使用。

我需要在AppVeyor CI yaml配置文件中添加这些内容。 AppVeyor CI具有缓存DRY安装目录以改善构建性能的这一奇妙功能。所以我已经缓存了gems目录,它在运行构建时恢复正常,但是gem install无论如何重新安装了宝石!

2 个答案:

答案 0 :(得分:1)

通过使用powershell运行命令,您可以使用错误重定向来检查命令是否成功:

$gemPath = gem which example3 2>$null

if ($gemPath)
{
    # We got a path for the gem driver
}
else
{
    # Failed, gem might not be installed
}

说明:我们告诉powershell存储" gem的结果,其中示例3"在变量$gemPath中,如果出现错误,我们希望使用$null将错误重定向到变量2>$null

您还可以使用与您要捕获的流相对应的数字替换2(成功,错误,警告等)

    *   All output
    1   Success output
    2   Errors
    3   Warning messages
    4   Verbose output
    5   Debug messages

有关此处重定向的更多信息About_Redirection

答案 1 :(得分:1)

尝试使用.cmd脚本:

gem which rails 1>nul 2>&1
IF ERRORLEVEL 1 (gem install rails)

我假设您希望输出stdoutstderr为此批处理脚本的目的而扼杀 - 否则,请删除1>nul 2>&1