234) メニュー画面を作りたい keikei 2004/02/10(火) 15:02 |
|
|
|
keikeiと申します、よろしくお願いします。 Windows2000の環境です。 以下のようなメニュー画面を作りたいのですが、どのようにすればいいのかわかりません。 ベタでファイル名、番号等をコーディングすればできるのですが、拡張性を持たせたいです。 ①カレントディレクトリのバッチファイル一覧を、1から順に番号を振りながら表示する。 その際に、バッチファイル内に設けた機能概要(たとえば@rem kkkのあとに概要を書く、というルールを作り)も番号と共に表示する。 (できれば、バッチファイル内に機能概要が書いてあるモノだけを表示対象としたいです。) ②メニュー画面表示用のバッチファイルから、カレントディレクトリにあるバッチファイルを呼べるようにする。 呼ぶ際には、バッチファイルを一覧表示した際の番号をユーザが指定し、バッチファイルを指定できるようにする。 どうでしょうか、このようなことをすることは可能でしょうか? それとも他の言語を使ったほうが良いでしょうか? よろしくお願いします。 |
|
236) Re:メニュー画面を作りたい じゃく 2004/02/10(火) 15:26 |
|
|
|
>以下のようなメニュー画面を作りたいのですが、どのようにすればいいのかわかりません。 完全に動く例を出すのは時間がかかるので、どのようなコマンドを 使ったら「で き そ う 」か書いてみます。 >①カレントディレクトリのバッチファイル一覧を、1から順に番号を振りながら表示する。 >その際に、バッチファイル内に設けた機能概要(たとえば@rem kkkのあとに概要を書く、というルールを作り)も番号と共に表示する。 >(できれば、バッチファイル内に機能概要が書いてあるモノだけを表示対象としたいです。) findstr "@rem kkk" *.bat >list.txt というふうにリストアップする。 >②メニュー画面表示用のバッチファイルから、カレントディレクトリにあるバッチファイルを呼べるようにする。 >呼ぶ際には、バッチファイルを一覧表示した際の番号をユーザが指定し、バッチファイルを指定できるようにする。 for /F をつかって、list.txt の表示を整形(先頭に行番号をつけたり)して一覧を表示する。 その後 set /p コマンドで番号を入力する。 入力された番号を元に、for /F で list.txt に含まれているバッチのファイル名から その番号に応じたバッチをcall文もしくは直接呼び出す。 こんなところでしょうか。 |
|
237) Re2:メニュー画面を作りたい oo 2004/02/11(水) 00:33 |
|
|
|
ちょっとだけ。 >findstr "@rem kkk" *.bat >list.txt findstr の落とし穴でですが、これだと "@rem" または "kkk" いずれかを含む行が引っかかります。この穴にはまったことあり。 findstr /C:"@rem kkk" とする必要があります。この場合は /B も指定したほうがいいかも。 |
|
240) Re:メニュー画面を作りたい Hellcat 2004/02/12(木) 22:49 |
|
|
|
>どうでしょうか、このようなことをすることは可能でしょうか? できますが、けっこう面倒ですよね。 フリーソフトのUnix like toolsなどを使って以下のようなバッチ(BM.BAT)を作ってみました。 ●機能記述のコメントルール バッチ内の機能説明のコメントをwhatコマンドで抽出することとしたため、以下のような形式で作成する必要があります。 @(#)xxxxxxxxxxxxxxxxx" @(#)と"記号に挟まれた文字列がコメントとして抽出される。 バッチ中では先頭に:を付すと良い。:@(#)xxxx........." 複数行指定してもOK。 テキストファイル中でもバイナリーファイル中でも埋め込まれた文字列の抽出が可能。 終端は"記号、NULL文字、復帰改行、>又は\記号。 デフォルトでは@(#)が指定されたすべての行を出力するが、@(#)行の一番最初の行のみを抽出する場合はwhatコマンドで-sスイッチを指定。 ●このバッチはd:/masm/work/test ディレクトリーにあるバッチファイルを探し出して処理することを前提に作成してあります。 /は\と同義と考えてください。 なお、trコマンドで/を\に変換し、指定されたバッチを起動するようにしてあります(絶対パスで起動をかける)。また、冒頭でrm -f menu*.txt bat_name.txtでファイル削除を行っています。Read-onlyのファイルでも黙って削除してしまいますので、留意してください。 ●バッチ(BM.BAT) @echo off :@(#)*** Sample batch for DOS プロンプト活用相談室 ***" rm -f menu*.txt bat_name.txt set echo_style=both ls d:/masm/work/test/*.bat|tr / \\ > bat_name.txt for /F %%i in ('ls d:/masm/work/test/*.bat') do ( what %%i | tr -IO \x0D\x0A \xFD\xFA > menu.txt fecho -n 'x0D'x0A >> menu.txt cat menu.txt >> menuall.txt ) cat -n menuall.txt > menuall2.txt tr -IO \xFD\xFA \x0D\x0A < menuall2.txt set /p ANS=%0: Enter batch No., awaiting reply = for /F %%x in ('bu !linputfile bat_name.txt %ANS%') do ( %%x ) ●出力例 1 d:/masm/work/test/assmbl.bat: Assemble %1 using MASM (ver5) ver=1.1 updated:1998/01/25 09:01:30 2 d:/masm/work/test/bm.bat: *** Sample batch for DOS プロンプト活用相談室 *** 3 d:/masm/work/test/grc.bat: Get return code 4 d:/masm/work/test/shogi.bat: Let's enjoy Shogi game (Kiwame) 5 d:/masm/work/test/tewpwb.bat: Text file editor (PWB) update:1998/10/30 22:35:10 BM: Enter batch No., awaiting reply = こんな感じです。 ●画面に収容し切れない場合は tr -IO \xFD\xFA \x0D\x0A < menuall2.txt | less 又は tr -IO \xFD\xFA \x0D\x0A < menuall2.txt | more などとすればよいでしょう。 lessコマンドは仙石浩明氏などが作成したフリーソフトがありますので、探してみてください。バックスクロールもできるので、moreよりもいいと思います。 ●awkなどを使えばもっとスマートに書けると思いますが、Unix like toolsにこだわり、catコマンドでナンバーリングを行うようにしたので、改行コードをいじくりまわすなど変梃な処理をしています。 Enter batch No., awaiting reply = に対する応答番号の正当性はチェックしていません(手抜き)。 ●rm,cat,ls,tr,fecho,whatの各コマンドは NTUXTL006.LZH http://www.piedey.co.jp/softs/ntuxtl006.lzh に収容されているものを使いました。 また、buコマンドはBATUTY(BU) http://www.vector.co.jp/soft/dos/util/se023753.html を使いました。 ●テスト環境 Windows2000 |
|
this article refers Vector Soft Library..
|
|
243) Re2:メニュー画面を作りたい keikei 2004/02/13(金) 17:21 |
|
|
|
丁寧にお答えいただき、ありがとうございます。 やはり実現するのはかなり面倒になってしまうんですね。 一つ質問なんですが、フリーソフトを使っての実現ってどうなんでしょうか? いろいろな開発環境で使っていくことを考えると、その都度のインストールの面倒さやバグの怖さ等を考えると、できるだけフリーソフトを使わないで実現させたいと思うのですが。 こんなことはただの食わず嫌いなんでしょうか? |
|
244) Re3:メニュー画面を作りたい oo 2004/02/13(金) 18:06 |
|
|
|
>いろいろな開発環境で使っていくことを考えると、その都度のインストールの面倒さやバグの怖さ等を考えると、できるだけフリーソフトを使わないで実現させたいと思うのですが。 じゃく さんがヒントを書かれてましたが、 今回の程度であれば標準機能だけでできます。 じゃく さんのヒントに対して返事が無かったのでご自分で考え中かなと思って投稿を控えてましたが、 「じゃく さんのヒントだけでは考えるのが難しい。答えを教えてくれ」ということであれば、作ってみたのがあるので、投稿します。 と書くと、ちょっとえらそうな物言いですね。せっかく作ったので、ちょっと形を整えてから投稿します(夜遅くか明日)。 >一つ質問なんですが、フリーソフトを使っての実現ってどうなんでしょうか? >いろいろな開発環境で使っていくことを考えると、その都度のインストールの面倒さやバグの怖さ等を考えると、できるだけフリーソフトを使わないで実現させたいと思うのですが。 >こんなことはただの食わず嫌いなんでしょうか? DOSやWin9x系のcommand.comは機能が貧弱なので、何らかのツールを使わないと複雑なことは難しいでしょう。私も bu.com や unix-like-tools を使ってました(Cygwinという選択肢もあります)。 NT4の途中からの cmd.exe は機能が拡張され、標準外部コマンドも増えたのでできることは大幅に広がりましたが、やはり出来ないものは出来ないです。 標準ツールでだけでやるならVBScriptでWSHやWMIを使うとさらにできる範囲は広がりますが、それなりに難しい世界です。 |
|
245) Re4:メニュー画面を作りたい oo 2004/02/13(金) 23:47 |
|
|
|
標準ツールだけでの例です。 ・ワークファイルを使うと却って複雑になりそうなので使いませんでした ・@REM KKK が2行以上あることは想定していませんが、「2行目以降を無視する」とか「1行目の続きにコメントを出す」とか仕様を決めれば対応は難しくないです ・入力は、数字のあとにバッチファイルに引き渡すパラメータを指定できます ・BATDIRはドライブ文字を必ず含むこと。含まない場合はその後のFOR文の書き換えが必要です ・特殊文字の入力に対する安全性はある程度チェックしましたが、全ケースは試せないので穴があるかも もし、REMKで始まる環境変数がグローバルには存在しないことを前提にしてよいなら、最後のほうの2行のIF文を、 if "!ANS!" == "0" exit /b if not defined REMK!ANS! goto loop に変えればイリーガルな入力に対する安全度がもう少し増すかと思います。 @REM バッチメニュー @echo off setlocal enabledelayedexpansion set BATDIR=c:\any\directory set /a N=0 for /f "delims=: tokens=1,2*" %%A in ('findstr /b /c:"@REM KKK " %BATDIR%\*.bat') do ( set /a N=N+1 set FILE!N!=%%A:%%B set NAME!N!=%%~nB set REMK!N!=%%C ) :loop echo. for /l %%I in (1,1,%N%) do ( echo %%I: "!NAME%%I!" !REMK%%I:@REM KKK =! ) set LINE= set /p LINE=enter 1..%N% (or 0 to exit) : if not defined LINE goto loop for /f "tokens=1*" %%A in ("!LINE!") do ( set ANS=%%A set PARM=%%B ) if !ANS! leq 0 exit /b if !ANS! gtr !N! goto loop !FILE%ANS%! !PARM! |
|
253) Re5:メニュー画面を作りたい keikei 2004/02/18(水) 14:59 |
|
|
|
>標準ツールだけでの例です。 作ってくださったんですね、ありがとうございます! 大切に使わせてもらいます。 う~む、パッと見ただけでは何をしているかわかりません・・・ じっくり解読して、勉強させていただきますね。 標準版だけでは難しいことが多いんですかぁ。 わたしとしましては、Perlに手を出そうと思っています。 なにはともあれ勉強あるのみ!ですね。 |