|
508) 日付入力チェックが上手くいきません じゃす子 2003/08/07(木) 09:44 |
|
はじめまして。PCはWin2000Proです。 現行掲示板のトピック索引のNo.213「日付入力チェックについて」を参考に、バッチを作成してみました。 同じように作ったつもりですが、うまく動作してくれません。 何故でしょう?(何分、よくわかっていないものですから・・・) 処理はプロンプト画面からバッチに引数渡しをしています。 作成したバッチは以下の通りです。 --------------- START --------------- @echo on set ans1=%1:~0,4% set ans2=%1:~4,2% set ans3=%1:~6,2% set /a y=1%ans1% -10000 if not "%ans1%"=="%y%" goto err set /a m=1%ans2% -100 if not "%ans2%"=="%m%" goto err set /a d=1%ans3% -100 if not "%ans3%"=="%d%" goto err if "%ans1%" GEQ "2001" ( if "%ans1%" LEQ "2100" ( echo OK )else ( echo NG ) ) else ( echo NG ) if "%ans2%" GEQ "01" ( if "%ans2%" LEQ "12" ( echo OK ) else ( echo NG ) ) else ( echo NG ) if "%ans3%" GEQ "01" ( if "%ans3%" LEQ "31" ( echo OK ) else ( echo NG ) ) else ( echo NG ) ・ ・ ・ ---------------- END ---------------- 現段階で処理を実行すると、 set /a y=1%ans1% -10000 にて、”演算子がありません”のメッセージが出力され、 if not "%ans1%"=="%y%" goto err にて、err処理が実行されてしまいます。 本当はこの処理をWinNT4.0にて処理を行いたいと思っています。 どなたか本当によろしくお願いします。 |
|
510) Re:日付入力チェックが上手くいきません ふぇむ 2003/08/07(木) 14:13 |
|
>set ans1=%1:~0,4% %変数名:~n,m% のパターンは、%1 %2 などの引数の展開では使えないと思います。 一回、set ARG1=%1 などによって変数にいれれば使えます。 それから、範囲チェックをしようとされている様子ですが、どの程度引数で与える YYYYMMDD 文字列が形式や範囲などについてチェック済みなのかどうかに依存しますが、もし渡し側でチェック済みなら受け側のチェックは省いてもいいと思います。ま た、受け側で完全にチェックを行なうならば、文字列長のチェックや、半角数値だけから構成されているか、などもっとチェックが必要と思います。 >if "%ans1%" GEQ "2001" ( 数値として比較したいならば、 "" はつけてはいけません。 例えば、 if "03" GEQ "3" は false ですが、 if 03 GEQ 3 は true です。 それから、NT4.0では if 文の else ってありましたでしょうか...? もしかするとなかったかも。 念のため、if /? で確認してみてください。 |
|
511) Re2:日付入力チェックが上手くいきません ふぇむ 2003/08/07(木) 14:19 |
|
>数値として比較したいならば、 "" はつけてはいけません。 ちょっと言葉不足でしたが、"" をつけなくても、文字列として評価されるパターンは文字列として比較されてしまいますのでご注意を。 |
|
513) Re3:日付入力チェックが上手くいきません じゃす子 2003/08/07(木) 16:45 |
|
ありがとうございます。ふぇむさん。 >%変数名:~n,m% のパターンは、%1 %2 などの引数の展開では使えないと思います。 引数では無理なんですね。変数に入れるように修正しました。 >それから、範囲チェックをしようとされている様子ですが、どの程度引数で与える YYYYMMDD 文字列が形式や範囲などについてチェック済みなのかどうかに依存しますが、もし渡し側でチェック済みなら受け側のチェックは省いてもいいと思います。ま た、受け側で完全にチェックを行なうならば、文字列長のチェックや、半角数値だけから構成されているか、などもっとチェックが必要と思います。 そうですね。受け側によるチェックを行おうとしているので、ふぇむさんの言われている、文字列長や半角数値のチェックを入れようと思います。(私に出来るかどうかは、わかりませんが・・・) >それから、NT4.0では if 文の else ってありましたでしょうか...? もしかするとなかったかも。 確認したところ、elseはありませんでした。elseにこだわるつもりはないので、他の方法で実施するように検討してみます。 |
|
520) Re4:日付入力チェックが上手くいきません ふぇむ 2003/08/08(金) 00:51 |
|
## やはり気持ち悪いので、前のを消して再アップしました。 >そうですね。受け側によるチェックを行おうとしているので、ふぇむさんの言われている、文字列長や半角数値のチェックを入れようと思います。(私に出来るかどうかは、わかりませんが・・・) いろいろ方法はあると思います。以下はたとえば、ということで。 半角数値だけで構成されているかどうかのチェックは、次のようにするとできます。 ●いったんワーク用の変数に格納し、その変数に対して半角数字の 0 から 9 までを削除し、何も残らなかったら元は全て半角数字だった、と判定。(※NT4.0で半角数字と全角数字が区別されるかどうか別途確認要) 削除は、set WORK=%ARG% とかした後に set WORK=%WORK:0=% set WORK=%WORK:1=% ......... というように、基本的には愚直に書けばいいと思います。ただ、試してみるとわかると思いますが、このコードのままでは途中で空文字になったときにおかしくなります。なので、サンプルのように、ダミーの文字列を付与して空白文字にならないようにすることが必要です。 また、文字列長のチェックは、ちょっと前にもここで話題に上ったように、結構やっかいですが、「8文字かどうか」をチェックするだけなら、たとえば次のようにしてしまえばいいと思います。 set CHECK_8mojime=%ARG:~7,1% set CHECK_9mojime=%ARG:~8,1% として、%CHECK_8mojime% が空でなく、%CHECK_9mojime% が空の場合だけがちょうど8文字。 それから、数字として扱う場合、8進数と認識されて08や09がエラーとなるように、文字列の前0の扱いがやっかいなので、書いていらっしゃるように、1 などを付与して考えてもいいと思いますが、いっそのこと前0を除去するサブルーチンとかを作っちゃってもいいかな、と思います。 参考までに、ちゃちゃいと書いた、半角数字チェックサブルーチンと前0削除サブルーチンを含むサンプルを載せます。私の好みで、サブルーチン側にあまり固 定情報をもたせたくないので、ちょっと冗長かもしれませんが、好きなようにいじってくださいませ。たぶん NT4.0 でも動くと思うんですが、手元に環境がないので試せていません...(^^; なお、補足ですが、文字列中に空白文字を含む可能性も考慮するならば、Windows2000以降では、引数を "" でくくって渡し、参照側で %~1 などの形式で参照する、という形式でカバー可能ですが、もしかすると %~1 という参照形式は NT4.0 ではできなかったかもしれません。 ------------------------------ SAMPLE @echo off rem rem 引数で指定した文字列のが半角数字だけで構成されたものかを判定し rem 合わせて数字の前0を削除するサンプル。 rem setlocal set TARGETSTR=%1 call :NUMERIC_CHECK RET TRUE FALSE %TARGETSTR% if "%RET%" == "TRUE" echo [%TARGETSTR%] は半角数字だけで構成されている。 if "%RET%" == "FALSE" echo [%TARGETSTR%] は半角数字以外が混じっている。 call :ZERO_TSUBUSHI RET %TARGETSTR% echo [%TARGETSTR%] の前0を全て消すと → [%RET%] goto :end rem rem 半角数値のみで構成されているかどうかをチェック rem rem 引数: rem arg1=チェック結果格納変数名 rem arg2=結果判定文字列~true時 rem arg3=結果判定文字列~false時 rem arg4=チェック対象文字列 rem 動作: rem チェック対象文字列が半角数値のみで構成されている場合、 rem arg1で渡された変数に指定したtrue時文字列かfalse時文字列が rem セットされて戻る。 rem :NUMERIC_CHECK set __RETVAR=%1 set __TRUE_STR=%2 set __FALSE_STR=%3 set __DUMMY=x set __WORK=%__DUMMY%%4 set __WORK=%__WORK:0=% set __WORK=%__WORK:1=% set __WORK=%__WORK:2=% set __WORK=%__WORK:3=% set __WORK=%__WORK:4=% set __WORK=%__WORK:5=% set __WORK=%__WORK:6=% set __WORK=%__WORK:7=% set __WORK=%__WORK:8=% set __WORK=%__WORK:9=% set %__RETVAR%=%__FALSE_STR% if "%__WORK%" == "%__DUMMY%" set %__RETVAR%=%__TRUE_STR% goto :eof rem rem 文字列の前0をつぶす。 rem rem 引数: rem arg1=変換結果格納変数名 rem arg2=変換対象文字列 rem 動作: rem arg2 で指定された文字列の先頭の全ての0を除去した rem 文字列を arg2で指定された変数にセットして返す。 rem :ZERO_TSUBUSHI set __RETVAR=%1 set __TARGET=%2 :ZERO_TSUBUSHI_LOOP set __CHECK=%__TARGET:~0,1% if "%__CHECK%" == "0" set __TARGET=%__TARGET:~1% if NOT "%__CHECK%" == "0" goto :ZERO_TSUBUSHI_LOOP_EXIT goto ZERO_TSUBUSHI_LOOP :ZERO_TSUBUSHI_LOOP_EXIT set %__RETVAR%=%__TARGET% goto :eof :end endlocal |
|
521) Re5:日付入力チェックが上手くいきません じゃす子 2003/08/08(金) 13:15 |
|
こんにちは。ふぇむさん。 >参考までに、ちゃちゃいと書いた、半角数字チェックサブルーチンと前0削除サブルーチンを含むサンプルを載せます。 サンプルまで作って頂いて感激です。 参考にさせて頂き、思い通りのバッチが作成出来ました。 大変ありがとうございました。 |