BATKEY

2005-04-24

あれ?

ちょっと必要があって、久し振りにバッチファイルを作っていました。 永らく使っていませんが、昔の記憶を頼りに作ります。 時々は触るのでだいたいの所は覚えているのですが、やはり忘れている事も多いのです。

バッチファイルの途中でキー入力を受け付けるコマンドに、BATKEY と言うのがあった筈です。 これを使おうと思ってヘルプを見るのですが、見つかりませんって…。

>batkey /?
'batkey' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

ネットで情報を漁ると、どうやら BATKEY は NEC が(PC-9801用の)MS-DOS で独自に追加したコマンドのようです。 Ver.3.3 の頃からだとか。 その後、いわゆる DOS/V機で動作する MS-DOS や IBM の PC-DOS では CHOICE というコマンドが追加されているようです。 あー、言われてみれば、そんなの有ったかも。 DOS/V 乗り換えと同時に Windows95 を使い始め、バッチファイルから遠のいてしまったので、よく覚えていません。

Windows98 なら、CHOICE が入っているようです。
WindowsXP には入っていないようです。 WindowsNT 系は皆同じかも。

自作

ネットで探せばたくさん公開されていそうですが、単純な仕様なら作る方が早そうです。 要するに1文字入力して、入力に応じた終了コードで終了するプログラムですから。 CHOICE は入力タイムアウトするスイッチが用意されているみたいで、作るとなると面倒そうですし。

コマンドスイッチ

スイッチはネットで調べてそれっぽく。

batkey {0|1|2} prompt
       0 ... 1桁の数字(0-9)を入力。0(0)〜9(9) を返す
       1 ... Yes/Noを入力。 0(y) または 255(n) を返す
       2 ... 1文字入力。文字コードを返す
  prompt ... プロンプトメッセージ

batkey.c

ソースコード。 簡単なのです。 でなきゃ自作しません。(^_^)
いろいろ言いたい事やアドバイスのある人は、掲示板辺りにどうぞ。

とりあえず VC ver.5 でコンパイルしたものを用意しました。

これで例えば仕事中に BATKEY が必要になっても大丈夫。 環境があれば、ソースをコピペで対応可能。 誰かに使って貰おうってんじゃなく、自分のため。 まぁ、Windows95 以来今まで必要じゃなかったから、今後そんな事があるとも思えませんが…。

batkey.c
#include    <stdio.h>
#include    <ctype.h>

void showHelp();

int main( int argc, char *argv[] )
{
    int     c;          /* 入力した文字   */
    int     r = 0;      /* batkeyの返り値 */
    int     i;          /* ループカウンタ */
    
    
    if( argc < 2 ) {
        showHelp();
        return( 0 );
    }
    
    /*-----------------------*/
    /* プロンプト表示        */
    /*-----------------------*/
    if( 2 < argc ) {
        for( i=2; i<argc; i++ ) {
            printf( "%s", argv[i] );
        }
    }
    
    /*-----------------------*/
    /* キー入力受付          */
    /*-----------------------*/
    switch( *argv[1] ) {
        
        /* 0-9 */
        case '0':
            while( 1 ) {
                if( isdigit ( c = (int)getchar() ) ) {
                    r = c - (int)'0';
                    break;
                }
            }
            break;
        
        /* yes/no */
        case '1':
            while( 1 ) {
                c = (int)getchar();
                if( toupper( c ) == 'Y' ) {
                    r = 0;
                    break;
                }
                if( toupper( c ) == 'N' ) {
                    r = 255;
                    break;
                }
            }
            break;
        
        /* ascii code */
        case '2':
            while( 1 ) {
                if( isprint( c = (int)getchar() ) ) {
                    r = c;
                    break;
                }
            }
            break;
        
        default:
            showHelp();
            break;
    }
    
    /*-----------------------*/
    /* 結果を返す            */
    /*-----------------------*/
    return( r );
}

void showHelp()
{
    /*-----------------------*/
    /* 使用法                */
    /*-----------------------*/
    printf( "usage:\n"                                                                  );
    printf( "batkey [{0|1|2}[ prompt]]\n"                                               );
    printf( "       0 ... 1桁の数字(0〜9)を入力します. 0(0)〜9(9) が返ります.\n"       );
    printf( "       1 ... Yes/No を入力します.          0(y)または255(n) が返ります.\n" );
    printf( "       2 ... 1文字入力します.             文字コードが返ります.\n"        );
    printf( "  prompt ... プロンプトメッセージ\n"                                       );
}
Copyright© 1998-2006 Hira