• ベストアンサー

MS-DOSの起動ディスクでループする?

どうにもいきづまってしまいましたのでお力を貸して下さい。 WindowsXPからMS-DOSの起動ディスクをフロッピーディスクで作成してAUTOEXEC.BATに下のように書いたのですがメニューから入力するところで止まらずうまくいきません。 Windowsのコマンドプロンプト上ではうまくいくのですが、調べてみたらコマンドプロンプトとMS-DOSが別ものということはわかったのですがどのように直していいかわかりません。 すみませんがご教授いただけないでしょうかよろしくお願いします。 環境 OS:Windows XP Pro PC:NEC VersaPro :Main cls @echo off rem メニュー echo キー入力後、エンターで決定して下さい echo [0] 処理 echo [E] 終了 rem 入力値の取得 set /p input= if defined input set input=%input:"=% rem 入力値判断 if /i "%input%" == "0" (goto KAKUNIN) if /i "%input%" == "E" (goto exit) else goto Main goto main :KAKUNIN cls echo 処理をしていいですか? Y/N set /p input= if defined input set input=%input:"=% if /i "%input%" == "Y" (goto SYORI) if /i "%input%" == "N" (goto Main) else goto KAKUNIN :SYORI 処理をする pause :exit

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

MS-DOSには、SET /P の機能がありません。従って、文字列を入力することはできません。 あと、IF の /I や ELSE や DEFINED の機能もありません。 MS-DOSでキー入力判断が必要な場合は、 http://www.vector.co.jp/soft/dos/util/se023753.html のようなツールを使います。 テストしてませんが、こんな感じかな? :Main cls @echo off rem メニュー echo キーを入力してください echo [0] 処理 echo [E] 終了 rem 入力値の取得 bu keylist 0E rem 入力値判断 if errorlevel 2 goto exit cls bu keyyesno 処理をしていいですか? if errorlevel 1 goto Main 処理をする pause :exit

ik140_o
質問者

お礼

思ったよりも制限があるのですね。MS-DOSになるとなにから調べていいのかわからなくて本当に困っていたので助かりました。 例まで記載していただいておかげさまでうまくいきました本当にありがとうございました。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 あ~懐かしいねぇ。MS-DOS 3.30(NEC版)あたりを使っていた頃はみんなこぞってテキストベースのメニューを作ってたもんだ。  で、MS-DOSの場合SET /Pが無い。なのでここを別のコマンドで代用してやる必要があるのじゃが・・・・、昔のMS-DOSにはこれを行うためのchoiceというコマンドがあった(choice.comかchoice.exeかは分からない)のだが、今ネットでざっと見てみるとWindows Meにもあるみたいやね。Windows 95、98、Meあたりが入手できるのであればchoiceコマンドも手に入るやも知れぬ。  で、choiceコマンドが入手できたら、後はそいつを使って結果はERRORLEVELを見るようにすればOK。choice.comはMS-DOS向けのコンパイラがあるのなら自作するのもそんなに手間な話ではないので作ってみても良いでしょう。LSI C-86 v3.30c 試食版でも作れるでよ。  それか・・・・ライセンス的にどうなのか分からないけど、http://bootdisk.comあたりをうろちょろしてみたり・・・・。

ik140_o
質問者

お礼

MS-DOSは奥が深いんですね。現在の便利な環境に慣れていると苦労します。 choiceについても調べてみます。ありがとうございました。

関連するQ&A

  • バッチファイル set /p による条件分岐について質問

    vistaを使っています。 set /p でキー入力を受け付け処理を分岐させるファイルを作っているのですが・・・ 例外の条件を定義する方法がわかりません。 詳細は下をご覧になってください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @echo off rem ##################################### rem 分岐プログラムサンプルです! rem ##################################### :start cls echo ■■■分岐プログラムサンプル■■■ echo 【1】test1へ! echo 【2】test2へ! echo 【3】test3へ! echo 【4】メニューを終了します! echo ■■■■■■■■■■■■■■■■■ set /p num="実行したいメニューの数字キーを入力してください⇒" if "%num%"=="1" goto A if "%num%"=="2" goto B if "%num%"=="3" goto C if "%num%"=="4" goto end . . . <省略> ↑のように入力された数字によって、処理が変わるようになっているのですが、ここで"上記以外の条件"を定義するにはどのように記述すればよいのかお教えいただけませんでしょうか。

  • 【Win】DOS バッチファイルの処理を番号選択…

    バッチファイルの内容 ------------------------------------------------------------------------------------ @echo off cls rem メニュー選択画面 :menu echo **************************** echo * キー入力でメニュー選択 * echo **************************** echo. echo  1.自宅環境(有線LAN・ADSL) echo  2.モバイル環境(Bluetooth DUN設定) echo  3.モバイル環境(Bluetooth PAN設定) echo. echo  99.終 了 echo. set /p choice="現在の環境を上記番号より選択して下さい:" rem 番号選択後の制御フロー if "%choice%"=="1" (goto homelan) if "%choice%"=="2" (goto btdnu) if "%choice%"=="3" (goto btpan) if "%choice%"=="99" (goto end) goto error :homelan rem 自宅環境(有線LAN・ADSL) 選択時の制御 echo 1.自宅環境(有線LAN・ADSL) rem モバイル環境(Bluetooth DUN設定) :btdnu echo 2.モバイル環境(Bluetooth DUN設定) rem モバイル環境(Bluetooth PAN設定) :btpan echo 3.モバイル環境(Bluetooth PAN設定) rem エラー時の制御 :error cls echo 入力エラー!:選択肢以外の番号が入力されました。正しい番号を再度入力して下さい。 goto menu rem 終了時の制御 :end exit ------------------------------------------------------------------------------------ 上記のコードは、持ち歩き用に使っているPCでWindowsのログオン時に起動させる処理をコントロールするためにネット上の情報を元に勉強がてら自分で書いています。(あと、ちなみにDOS関連の知識はほとんどありません。) batファイルで保存し、DOSプロンプトでテストをしていました。 IMEはオフにし、番号選択の「1」「2」「3」を10キーボードから入力すると、errorラベルに飛んでしまい、こちらが想定している正しい処理に飛びません。(ちなみに、「99」と入力したときは正しく処理されいています。) どこにコーティング上のミスがあるのか判別がつかないため、ミスを犯しているポイントを教えていただけると幸いです。 また、カテゴリーを変更したほうがいいなどのアドバイスがありましたら、誘導していただけると幸いです。 どうかよろしくお願いしますm(__)m

  • 【バッチファイル】コマンドの説明

    @echo off cls :start ECHO. echo 以下から該当PCの作業形態を選択して下さい。 echo 1:データ移行有り echo 2:データ移行無し set choice= set /p choice=上記の番号を入力して下さい(1,2)> if not '%choice%'=='' set choice=%choice:~0,1% if '%choice%'=='1' goto ikou_ari if '%choice%'=='2' goto ikou_nashi ECHO "%choice%" is not valid please try again ECHO. goto start お世話になっております。 今回は、上記の「set choice=」以下の部分が どういった処理をしているのかをお聞きしたくて投稿いたしました。 特に、「set」の使い方と言いますか、 「set」の役割(set以下の処理)がどういうものなのかを お教えいただきたいと思っております。 よろしくお願いいたします。

  • DOSのIF文でつまづいています

    DOSのプログラムでつまづいています。 test.batの中身 ************************************************ if %1==start goto start else if %1==stop goto stop else goto error :start rem スタート処理 echo start%1 > test.txt :stop rem ストップ処理 echo stop%1 > test.txt :error rem エラー処理 echo error%1 > test.txt exit ************************************************* うまく処理できる方法を教えてください。

  • バッチでループさせた場合、処理に失敗するとループを抜けてしまい、困っています。

    仕事でバッチ作成をしていますが、うまく動作しなくて困っています。 もしわかる方がいましたら、教えていただけると助かります。 <実現したいこと> いくつかのサーバに同じディレクトリがあり、そのディレクトリの下のファイルをサブフォルダを含めて削除したい。 ただし、そのフォルダの下には何が入っているかはそれぞれ異なる(何もない場合もあり) たとえば、F:\test1\というフォルダはすべてのサーバに共通してあるが、その下に1と0のフォルダがあったりなかったりし、ある場合はその直下をすべて削除したい(1もしくは0フォルダは削除しない) また、1もしくは0のフォルダが両方なかった場合は、メッセージを出力したい。 <ソース> ※ a.iniの中身 F:\test1 F:\test2 ・・・(削除対象フォルダの一覧) for /f %%i in (a.ini) do ( set f=0 (1)rem 0フォルダがある場合、その直下を削除 if exist %%i\0\nul (set f=1 && call :sub %%i\0) (2)rem 1フォルダがある場合、その直下を削除 if exist %%i\1\nul (set f=1 && call :sub %%i\1) (3)rem 両方のフォルダがない場合 if %f%==0 (call :notf %%i) ) goto end :notf echo 削除対象フォルダ(%1)なし goto :eof :sub rem ファイル削除 del /s /q %1\*.* rem フォルダ削除 for /f %%i in ('dir /ad /b %1') do rd /s /q %1\%%i goto :eof :end (終了処理) <問題> 以上の処理を実行すると、以下の問題が出ます。 1.(3)両方のフォルダがなかった場合も、notfの処理に行かない 2.(1)0フォルダの中にあるファイルの削除に失敗した場合、(2)の1フォルダに対する処理に行かず、ループを抜けてendに進んでしまう。 申し訳ございませんが、回答お願いします。

  • バッチファイルのIF分岐にて任意の文字を入力しておきたい

    バッチファイルのIF分岐にて任意の文字を入力しておきたいです。 下記のようなバッチファイルを作成し、「1」を入力すると「:AAA」のラベル に飛びメッセージが表示されるようにしています。 最初から「1」が自動で入力されているような状況にすることはできますでしょうか? 「set NUM=1」にしておけば、Enterを押すだけで「1」が入力されている のはわかったのですが、DOS上に「1」が表示されていません。 入力待ちの際に「1」が入力されている状況を作りたいと思っています。 Windows XP 32bitで動作させたいです。 お手数ですが知識をお借りしたいと思います。 もしくは「ここを見ろ」というのをご教授ください。 -------------------------------------------------- @echo off :LOOP set NUM= cls echo. echo "1. AAA" echo "2. BBB" echo "0. 終了" echo. echo. set /p NUM="番号を入力してください >" if %NUM% == 1 goto :AAA if %NUM% == 2 goto :BBB if %NUM% == 0 goto :owari echo 番号がありません echo. pause goto :LOOP :AAA echo "AAAです" echo. pause goto :LOOP :BBB echo "BBBです" echo. pause goto :LOOP :owari echo 終了します echo. pause goto :eof --------------------------------------------------

  • BATのIF文について質問

    @echo off cls set LOGFILE=C:\%COMPUTERNAME%.log find C:\temp\setting.txt "SERVER01" /I if %ERRORLEVEL% == 1 GOTO END if %ERRORLEVEL% == 0 ( set MESSAGE=SEVER01の環境です echo %MESSAGE% echo %MESSAGE% >> %LOGFILE% GOTO SET1 ) :SET1 echo テスト >> %LOGFILE% :END こんな簡単なBATを作成してみましたがERRORLEVELが0の時処理されません (「SEVER01の環境です」がLOGに書き込まれません) (もちろんsetting.txtには「SERVER01」の文字が入ってます) (FINDのあと、「echo %errorlevel」を記述して0にもなっているのですが) IFの構文として間違っていますか?どなたかご教授ください。 OSはWindowsXP SP3 64Bitです。

  • バッチファイルに日付(ミリ秒まで)をつけたい

    OS: Windows XP あるソフトを使っており、20分おきにexcelシートが自動的に デスクトップ上に「full01.xls」という名前で記録されます。 そこで上書きされないようにするためにバッチファイルを使ってリネー ムするようにしました。 そこで質問ですが新しいexcelシートが出来るたびに出来た時間がわか るようにしたいです。 どのようにすればよいでしょうか? またそれをどこに挿入すればよいか教えていただきたいです。 よろしくお願いします。 @echo off :TOP rem 空きファイル名を検索 set /a N=2 :SEARCH rem 2~9はfull0x, 10以上はfullxxにする set F=full0 if %N% GTR 9 set F=full if not exist %F%%N%.xls goto WAIT set /a N=N+1 goto SEARCH rem full01.xlsが生成されるのを待つ :WAIT echo Search full01.xls :LB1 rem Sleep if not exist full01.xls goto LB1 echo Found full01.xls echo New File = %F%%N%.xls echo Waiting for file write... rem ファイルの書込動作が完全に終るまで待つ set /a M=1 :WAIT2 if "%M%"=="9999" goto RENAME set /a M=M+1 goto WAIT2 :RENAME echo Rename ren full01.xls %F%%N%.xls echo Done. rem ずっと繰り返し goto TOP

  • バッチファイルのループ処理の質問です。

    バッチファイルのループ処理の質問です。 バッチファイルでサーバにセキュリティーパッチをインストールしたいのですが、 一件しかインストール出来ません。 ---------------------------------------------- @echo on setlocal set SrcDir=\\192.168.11.5\temp\ for %%i in (%SrcDir%*.msu) do ( %%i /quiet /norestart >>Instarll_log.log IF ERRORLEVEL 3010 GOTO ReqReboot IF ERRORLEVEL 1 GOTO NG IF ERRORLEVEL 0 GOTO OK :NG echo 異常 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :OK echo 正常 > kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :ReqReboot echo 再起動が必要 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log ) goto END :END endlocal ---------------------------------------------- 続けて次のファイルをインストールするにはどうすれば良いか 教えてください。

  • DOSコマンドでの値の範囲チェック方法

    DOSコマンドでの値の範囲チェック方法 DOSコマンドでの値の範囲チェック方法を教えてください。 やりたいことのイメージは以下の感じです。 画面からの入力を受けそのあとの処理を実行するが、 入力を受けた際に後続の処理で使用できる値(0~9,A~F)かどうかをチェックし、 使用できない値だったら再入力を促す、という感じです。 :BG SET /P INPUT_BG=値を入力してください: IF (INPUT_BGが1文字ではない || INPUT_BGが0~9,A~Fではない) ( echo 0~9,A~Fの一文字で入力してください GOTO :BG ) …INPUT_BGを使った処理… 最悪の場合、以下のようにIF文を入れ子にすれば実現できることは確認しています。 IF NOT "%INPUT_BG%"=="0" ( IF NOT "%INPUT_BG%"=="1" ( IF NOT "%INPUT_BG%"=="2" ( echo 0~9,A~Fの一文字で入力してください GOTO :BG ) ) ) しかしあまりにもかっこ悪い。 しかもめんどいし、16個の入れ子なんか見たくない。 ということでエレガントな書き方を教えてください。 よろしくお願いします。