使用开关菜单并将参数传递给函数

时间:2016-10-05 15:22:40

标签: powershell

我有一个我正在处理的具有菜单功能的脚本

DO {
$selection = Read-Host ">"
SWITCH ($selection) {
    '-h' {GET_HELP}
    'refresh' {REFRESH_LIST}
    'start' {INSTANCE_START}
    'stop' {'STOPPING INTANCE'}
    'q' {BREAK}
    DEFAULT {'ENTER -h FOR HELP'}
 }} until ($selection -eq 'q')

我要对此脚本执行的操作是启动和停止虚拟机。它列出了所有机器,在菜单中我希望用户按如下方式发出命令:

start <hostName>

作为切换菜单中的命令的start和始终不同的<hostName>是传递给INSTANCE_START函数的参数。我的第一个想法是使用split来分割输入的字符串,并使拆分引用的第一部分切换到要切换的情况,第二部分是传递给函数的变量。这是最好的方法吗?或者是否有更容易的方法和菜单?

2 个答案:

答案 0 :(得分:1)

Switch语句有自己的开关来修改其行为 使用-wildcard并添加*代替变量部分:

switch -wildcard ($selection) {
    '-h'      { GET_HELP; break }
    'refresh' { REFRESH_LIST; break }
    'start *' { INSTANCE_START; break }
    'stop *'  { 'STOPPING INTANCE'; break }
    'q'       { break }
    default   { 'ENTER -h FOR HELP' }
}

Switch与PS中的所有基本字符串运算符一样不区分大小写(-eq-ne-like-match),
所以没有必要改变信件的情况。

答案 1 :(得分:0)

您可以在切换案例中使用表达式:

FROM mhart/alpine-node:6.7
MAINTAINER First Lastname <user@example.com>

# Set environment vars
ENV HOME=/root \
    APP_DIR=/root/app \
    DIST_DIR=/var/www \
    AWS_REGION=us-east-1 \
    NPM_CONFIG_LOGLEVEL=info \
    LANG=en_US.UTF-8 \
    LC_ALL=C.UTF-8 \
    LANGUAGE=en_US.UTF-8

# Install packages
RUN apk --no-cache add \
        --virtual build-dependencies \
        ca-certificates \
        nginx \
        build-base \
        bzip2 \
        git \
        python-dev \
        libffi-dev

RUN mkdir -p ${APP_DIR}
WORKDIR ${APP_DIR}
COPY . ${APP_DIR}

# Install node packages
RUN set -uex ;\
    npm install -g angular-cli@1.0.0-beta.16 typescript@2.0.3 process-nextick-args ;\
    npm install --production --unsafe-perm ;\
    npm cache clean

ARG ENV
ENV ENV=${ENV}

# Build project
RUN set -uex ;\
    ng build  --environment=${ENV} ;\
    mv dist ${DIST_DIR} ;\
    rm -fr ${APP_DIR}

# nginx config
COPY ./nginx/nginx.conf /etc/nginx/
RUN set -uex ;\
    mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled/ ;\
    chmod -R 755 /etc/nginx/sites-* ;\
    ln -sf /dev/stdout /var/log/nginx/access.log ;\
    ln -sf /dev/stderr /var/log/nginx/error.log
COPY ./nginx/account-curation.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/account-curation.conf /etc/nginx/sites-enabled/

# App port
EXPOSE 80 81

# Start nginx
ENTRYPOINT [ "nginx" ]