bat 脚本参数解析

2020-06-19  本文已影响0人  刘亚彬92

在日常开发过程中,我们经常会写一些脚本来帮助我们实现部分自动化的功能。而在使用脚本的过程中,参数解析又是经常使用的功能。本文将介绍 windows 平台上 bat 脚本如何进行参数解析。

1 参数的组成

首先我们来看一下命令的组成,一个完成的命令由命令(command)、选项(option)和位置参数(position argument)组成。如 git checkout -b dev 命令中。git 为主命令(command),checkout 为子命令(sub-command),-b 为选项(option)而 dev 为位置参数(positional argument)。

2 示例说明

介绍完参数的基本组成之后,接下来我们就开始设计 bat 的参数解析方式了。由于我们使用 bat 脚本往往不会实现太复杂的功能。因此这里设计的参数解析也有一些简化,这里并不会使用位置参数,需要位置参数的地方,我们可以使用必须选项来代替。这里的参数解析主要实现以下功能:

3 示例代码

@echo off
set virtual_env=conan

setlocal EnableDelayedExpansion

set is_workon=0
set valid_param=0
set set_vir_env=0
set set_force=0
set set_help=0
set force=0

cd ..
set pro_root=!cd!
:loop
if not "%1"=="" (
    set valid_param=0

    if "%1" == "--vir_env" set set_vir_env=1
    if "%1" == "-v" set set_vir_env=1
    if "!set_vir_env!"=="1" (
        if "%2"=="" (
            echo parameter not enough, virtual environment must be give.
            goto :end
        )
        set virtual_env=%2
        set valid_param=1
        shift
    )

    if "%1" == "--force" set set_force=1
    if "%1" == "-f" set set_force=1
    if "!set_force!"=="1" (
        set force=1
        set valid_param=1
    )

    if "%1" == "--help" set set_help=1
    if "%1" == "-h" set set_help=1
    if "!set_help!" == "1" (
        echo USAGE: %0 options.
        echo  options:
        echo    `--vir_env/-v value`:  set conan virtual environment to the value, default is 'conan'.
        echo    `--force/-f`:          overwrite exist package.
        echo    `--help/-h`:           print this message and exit.
        goto :end
    )

    if "!valid_param!" == "0" (
        echo "unknown options: %1, use `-h` to show all avaliable options."
        goto :end
    )
    shift
    goto :loop
)

CALL workon !virtual_env!
set is_workon=1
if exist "conan_builds" rd /q /s "conan_builds"
mkdir conan_builds
cd conan_builds

REM build and install
cmake -DCMAKE_INSTALL_PREFIX=%pro_root%/conan_install ..
cmake --build . --config Release
ctest -VV -C Release
if errorlevel 1 (
    echo "ctest failed."
    goto :end
)
cmake --install . --config Release

REM package
cd !pro_root!/conan_pkg
if "!force!"=="1" (
    conan export-pkg . common/dev --package-folder=!pro_root!/conan_install -f
) else (
    conan export-pkg . common/dev --package-folder=!pro_root!/conan_install
)
if errorlevel 1 (
    echo "package failed."
    goto :end
)

REM test
cd !pro_root!/conan_pkg/pkg_test
if exist "builds" rd /q /s "builds"
mkdir builds
cd builds
conan install ..
cmake ..
cmake --build . --config Release
bin\main.exe
if errorlevel 1 (
    echo "package test failed."
    goto :end
)

:end
if "!is_workon!" == "1" (
    CALL deactivate
)
cd !pro_root!/scripts

这个示例代码是用来实现 c++ 库的自动编译、测试、打包、测试包的流程。由于这里我们主要是学习如何使用 bat 的参数解析。因此具体的执行内容其实我们不用关心。这里一共使用了三个参数:

在输入其他无效的选项时,会报错。这里在实现的时候需要注意一下几点:

其他的语句要么比较容易理解,或者是和业务相关无需关心,因此这里不再介绍了。

参考资料:

windows batch SET inside IF not working
How do I get the application exit code from a Windows command line?
Windows Bat file optional argument parsing
How to use logical "OR" operator in batch script

上一篇下一篇

猜你喜欢

热点阅读