バッチファイルにより、複数のバッチファイルを切り替えて使いたいのですが、条件分岐IFで、分岐するために、キーボードより英数文字を入力し、それにより条件分岐する。プログラムを知りたいのですが、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

標準でも確かYes/No分岐くらいは出来たはずですが、


昔のことで忘却しました(汗)

で、私はBATUTYという補助ユーティリティをよく利用していました。
これだとキーボード入力以外にも細かいことまで出来るので覚えると重宝すると思います。
ただ、バッチファイルで利用するには別途BATUTY本体(bu.com)が必要になるので、BATCH FILE Compilerでbu.comを取り込んで単一ファイルのcom/exeファイル化することが出来ます。

BATUTY
http://www.vector.co.jp/soft/dos/util/se023753.h …

BATCH FILE Compiler
http://www.vector.co.jp/soft/dos/util/se004539.h …

参考まで

参考URL:http://www.vector.co.jp/soft/dos/util/se023753.html,http://www.vector.co.jp/soft/dos/util/se004539.h …
    • good
    • 0
この回答へのお礼

yes/no分岐 askyyesnoで、やってみます。
ありがとうございました。
 

お礼日時:2001/02/08 08:18

昔のMS-DOS(5.0あたり。

その前後はよく覚えてません)にはbatkeyという外部コマンドがあって、入力されたキーのASCIIコードをエラーレベルとして返すことができました。あとはバッチファイルで、
if errorlevel=xx goto label
という構文を組み合わせて条件分岐させることができます。else構文が使えないうえに、エラーレベル判定は「xx以上」でジャンプしてしまうので、複数の選択肢を使いたい場合はif文を、数値を逆順に並べた上で羅列する必要がある点に気をつけてください。残念ながらbatkeyはWin95/98にはないようなので、DOS窓でそのまま利用することはできないようですが。
いずれにしろ、なにかしらの外部コマンド(ツール)は必要なので、batutyはわたしからもお勧めです。テキストベースならけっこう複雑なプログラムも書くことができました。
また、複数のバッチファイルを呼び出すとのことですが、単純に呼び出すと元のメニューに戻れなくなるので、
command /c batfile1.bat
などのようにするか(合ってるかな……。DOS窓でこれをやって平気かどうかも不明です)、1本のバッチファイルにまとめてしまう必要があります。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチファイル IF 複数条件方法

WindowsXP環境にて下記のバッチファイルがあります。

rem --- 時間変数 ---
set yyyy=%date:~-10,4%
set yy=%date:~-8,2%
set mm=%date:~-5,2%
set dd=%date:~-2,2%

rem --- ログフォルダ変数 ---
set LOG_DIR1=D:\LOG

rem --- ログファイル変数 ---
set LOG_FILE1=LOG.txt

set A=1

set B=2

IF %A% == 1 IF %B% == 2 (
echo %yyyy%%mm%/%dd% %HHMMSS%正常終了 >> %LOG_DIR1%\%LOG_FILE1%
) ELSE (echo %yyyy%%mm%/%dd% %HHMMSS%異常終了 >> %LOG_DIR1%\%LOG_FILE1%)

pause

上記プログラムだとログ上で【200912/10 正常終了】と表示されるのに、【set A=10】と変更して
【200912/10 異常終了】の表示がログ上に出力されるだろうと期待して実行した結果、
何も表示されてませんでした。

どこに問題があるのでしょうか?

WindowsXP環境にて下記のバッチファイルがあります。

rem --- 時間変数 ---
set yyyy=%date:~-10,4%
set yy=%date:~-8,2%
set mm=%date:~-5,2%
set dd=%date:~-2,2%

rem --- ログフォルダ変数 ---
set LOG_DIR1=D:\LOG

rem --- ログファイル変数 ---
set LOG_FILE1=LOG.txt

set A=1

set B=2

IF %A% == 1 IF %B% == 2 (
echo %yyyy%%mm%/%dd% %HHMMSS%正常終了 >> %LOG_DIR1%\%LOG_FILE1%
) ELSE (echo %yyyy%%mm%/%dd% %HHMMSS%異常終了 >> %LOG_DIR1%\%LOG_FILE1%)

pause

上記...続きを読む

Aベストアンサー

期待する結果が出ていないソースだけの提示ではロジックが正確に分からないのでロジックを書いてもらといいかもしれません。
例えば、A=1かつB=2で正常終了、それ以外は異常終了にしたい、コードは今はこうなっていると。変数A,Bにはこういう値が入る可能性があるとかまでわかればなおよしと思います。
上記であればこんな感じではダメ?
@echo off
rem --- 時間変数 ---
set yyyy=%date:~-10,4%
set yy=%date:~-8,2%
set mm=%date:~-5,2%
set dd=%date:~-2,2%

rem --- ログフォルダ変数 ---
set LOG_DIR1=D:\LOG

rem --- ログファイル変数 ---
set LOG_FILE1=LOG.txt

set A=11

set B=2

IF "%A%-%B%" == "1-2" (
echo %yyyy%%mm%/%dd% %HHMMSS%正常終了 >> %LOG_DIR1%\%LOG_FILE1%
) ELSE (
echo %yyyy%%mm%/%dd% %HHMMSS%異常終了 >> %LOG_DIR1%\%LOG_FILE1%
)

期待する結果が出ていないソースだけの提示ではロジックが正確に分からないのでロジックを書いてもらといいかもしれません。
例えば、A=1かつB=2で正常終了、それ以外は異常終了にしたい、コードは今はこうなっていると。変数A,Bにはこういう値が入る可能性があるとかまでわかればなおよしと思います。
上記であればこんな感じではダメ?
@echo off
rem --- 時間変数 ---
set yyyy=%date:~-10,4%
set yy=%date:~-8,2%
set mm=%date:~-5,2%
set dd=%date:~-2,2%

rem --- ログフォルダ変数 ---
set LOG_...続きを読む

Q条件分岐のバッチファイル

「D&Dした複数ファイルを、そのファイル名と同名のフォルダ(既に作成済み)の中にある、Aというフォルダに移動する。」という動作をするバッチファイルを、以前の質問などを参考にしながらわからないなりに作ってみました。

:LOOP

if %1 == "" GOTO XEND

move %1 "C:\Documents and Settings\(ユーザー名)\デスクトップ\%~n1\A"
SHIFT
GOTO LOOP

:XEND

PAUSE

これで動作したのですが、これにさらに

「ファイルの拡張子がjpgならフォルダAへ、bmpならフォルダBへ、

 pngかつファイルサイズが2MB以下ならばフォルダCへ、それ以上ならフォルダDへ移動」

という動作を追加したいです。結構複雑なのですが、これはバッチファイルで可能なのでしょうか?

長文の上、わかりにくくてすいません。

可能ならば、どなたか教えていただけないでしょうか。よろしくお願いします。

Aベストアンサー

%~x1 で%1の拡張子のみ取得することが出来ます。
ただし拡張子が小文字か大文字かが不定なので、一工夫が必要です。
%ALP:a=A% とすると、環境変数ALPに含まれるaがAに変換されます。

%~z1 で%1のファイルサイズを取得することが出来ます。

条件分岐は既にお使いのif関数で出来ます。

ということで、戯れに作ってみました。

@Echo Off

Set BASE=C:\Documents and Settings\(ユーザー名)\デスクトップ
Echo 移動のベースは[%BASE%]です。
Echo.

:LOOP
If "%~1"=="" Goto ENDP

Set EXT=%~x1
If "%EXT%"=="" Goto doNothing
Set EXT=%EXT:j=J%
Set EXT=%EXT:p=P%
Set EXT=%EXT:g=G%
Set EXT=%EXT:b=B%
Set EXT=%EXT:m=M%
Set EXT=%EXT:n=N%

if %EXT%==.JPG Goto doJPG
if %EXT%==.BMP Goto doBMP
if %EXT%==.PNG Goto doPNG

REM 拡張子がいずれでもない時の動作
Set MOVED=%~n1\E
Goto doMOVE

:doNothing
REM 拡張子無し時の動作
Set MOVED=%~n1.d\F
Goto doMOVE

:doJPG
REM jpg時の動作
Set MOVED=%~n1\A
Goto doMOVE

:doBMP
REM bmp時の動作
Set MOVED=%~n1\B
Goto doMOVE

:doPNG
if %~z1 LEQ 2097152 Goto doSPNG
if %~z1 GTR 2097152 Goto doBPNG

:doSPNG
REM pngで2M以下の時の動作
Set MOVED=%~n1\C
Goto doMOVE

:doBPNG
REM pngで2Mより大きい時の動作
Set MOVED=%~n1\D
Goto doMOVE

:doMOVE
Echo [%~1]を[%MOVED%]に移動します。
Set MOVED="%BASE%\%MOVED%"
If Not EXIST %MOVED% Mkdir %MOVED%
Move "%~1" %MOVED%
Shift
Goto LOOP

:ENDP
Echo.
Echo 移動が完了しました。
Echo 何かキーを押して終了してください。
Pause>NUL
Exit /b 0

といった感じになります。
移動先を変える場合は「3行目のBASE=の後を変える」とか
「Set MOVED=%~n1\A みたいなとこを変える」です。

追加機能
・ディレクトリの自動作成
・拡張子が想定外の場合の追加(Eに移動)
・拡張子が無かった場合の追加(ファイル名.d\Fに移動)

%~x1 で%1の拡張子のみ取得することが出来ます。
ただし拡張子が小文字か大文字かが不定なので、一工夫が必要です。
%ALP:a=A% とすると、環境変数ALPに含まれるaがAに変換されます。

%~z1 で%1のファイルサイズを取得することが出来ます。

条件分岐は既にお使いのif関数で出来ます。

ということで、戯れに作ってみました。

@Echo Off

Set BASE=C:\Documents and Settings\(ユーザー名)\デスクトップ
Echo 移動のベースは[%BASE%]です。
Echo.

:LOOP
If "%~1"=="" Goto ENDP

Set EXT=%~x1
If "%EXT%"=="" G...続きを読む

Qバッチファイルで一つのファイルをdirで比較し分岐

バッチファイルでフォルダにある全てのファイルに対し
ファイルごとにdir /T:Cとdir /T:Wで比較し
同じならば削除
異なれば何もしない
処理をしたく質問させて頂きました

次のような結果の場合日時が同じなのでファイルを削除する
C:\>dir D:\AAA\001.jpg /T:C
ドライブ D のボリューム ラベルは microSD です
ボリューム シリアル番号は E484-83B8 です

D:\AAA のディレクトリ

2012/11/28 12:59 1,284 001.jpg
1 個のファイル 1,284 バイト
0 個のディレクトリ 24,690,798,592 バイトの空き領域

C:\>dir D:\AAA\001.jpg /T:W
ドライブ D のボリューム ラベルは microSD です
ボリューム シリアル番号は E484-83B8 です

D:\AAA のディレクトリ

2012/11/28 12:59 1,284 001.jpg
1 個のファイル 1,284 バイト
0 個のディレクトリ 24,690,798,592 バイトの空き領域


日時が異なるので何もしない
C:\>dir D:\AAA\002.jpg /T:C
ドライブ D のボリューム ラベルは microSD です
ボリューム シリアル番号は E484-83B8 です

D:\AAA のディレクトリ

2012/11/07 03:12 1,443,326 002.jpg
1 個のファイル 1,443,326 バイト
0 個のディレクトリ 24,690,798,592 バイトの空き領域

C:\>dir D:\AAA\002.jpg /T:W
ドライブ D のボリューム ラベルは microSD です
ボリューム シリアル番号は E484-83B8 です

D:\AAA のディレクトリ

2012/11/04 17:53 1,443,326 002.jpg
1 個のファイル 1,443,326 バイト
0 個のディレクトリ 24,690,798,592 バイトの空き領域


またもっと簡単にdir D:\AAA /T:Cとdir D:\AAA /T:Wの結果で
分岐処理は可能でしょうか

よろしくお願いします

バッチファイルでフォルダにある全てのファイルに対し
ファイルごとにdir /T:Cとdir /T:Wで比較し
同じならば削除
異なれば何もしない
処理をしたく質問させて頂きました

次のような結果の場合日時が同じなのでファイルを削除する
C:\>dir D:\AAA\001.jpg /T:C
ドライブ D のボリューム ラベルは microSD です
ボリューム シリアル番号は E484-83B8 です

D:\AAA のディレクトリ

2012/11/28 12:59 1,284 001.jpg
1 個のファイル 1,284 バイト
0 個...続きを読む

Aベストアンサー

No1です。
これでどうでしょう。

@echo off
cd /d D:\AAA
for /f "delims=" %%A in ('dir /b /s /a-d') do (
for /f "tokens=1,2" %%B in ('dir "%%A" /t:c ^| findstr /b 2') do (
for /f "tokens=1,2" %%D in ('dir "%%A" /t:w ^| findstr /b 2') do (
if "%%B %%C" == "%%D %%E" del "%%A"
)
)
)

QバッチコマンドのIF文(条件式)の中で

バッチコマンドのIF文(条件式)の中で
ORを使うとエラーになります。
別の方法があれば教えてください。。

Aベストアンサー

「バッチ」といっているから MS-DOS か Windows か, その辺?
そうなら, if の条件は単純な比較しかかけない (ヘルプを見ればわかる) ので, 複数の if を使ってください.

Qプログラム/条件分岐について2

プログラム初心者です. (言語: C shell (csh))

『ファイルAは上から5行分を使用する』

『もしファイルBに, Cの答えが2つ以上ある場合は, 最初の答えを選択する』

『もし, Dの答えが2つ以上ある場合は, ファイルEから5行目までを使用する』

というプログラムをそれぞれ組みたいと思っております.
私の日本語説明が稚拙でわかりにくいかもしれませんがどなたか教えてくださると嬉しいです><

プログラム質問第二段です...(涙)
書いて実行するたびにエラーが出てくるので質問させてもらいます><
どうぞよろしくお願いいたします.

Aベストアンサー

シェルスクリプトを作るときのコツは「条件分岐はなるべく使わない」だと思っています。
「条件に合っていたら処理する」
ではなく
「条件に合っているものを取り出して、その全てを処理する」

その方が見た目も簡単で、パフォーマンスがよいことが多いです。
whileでループ→ifで分岐など、本当にそれしか無いときだけに限った方がよいです。

また、cshを使う積極的な理由が無いのなら、B-sh系を使うのが一般的です。
対話シェルにcshを使っていても、スクリプトをshで書くことに何の問題もありません

質問中の「使用する」「選択する」というのがどんな意味で使っているかがよくわかりません。
また、ファイルの中がどうなっているかもわかりません。
なので、以下のことはそのまま使えないかもしれません。


1.
headという、そのものずばりのコマンドがあります。tailと組み合わせれば、任意の箇所から任意の行を抜き出せます。
sedのオプションとスクリプトの組み合わせでも可能です。

2.
「Cの答え」がどんな記述になっているか、が書いてないのでわかりません。
1行に書いてある、かつ、他と区別できる特定の書式がある、だったら
grep 特定書式を抽出する表現 B | head -1
複数行だと
sed -n '/Cの答えの始まり/,/Cの答えの終り/{p;q}' B
とかでしょうか。

3.
前回のと組み合わせです。
ファイルAの行数が3以上なら処理が、cshなら

if ( `wc -l < A` >= 3)
処理
endif

ですか。
「Dの答えが2つ以上」なら
grepでDの答えを抽出 → wcで行数を数える→2以上か判定
ですし、「ファイルEの5行目まで」は最初の質問のファイルがAからEに変わっただけです。

シェルスクリプトを作るときのコツは「条件分岐はなるべく使わない」だと思っています。
「条件に合っていたら処理する」
ではなく
「条件に合っているものを取り出して、その全てを処理する」

その方が見た目も簡単で、パフォーマンスがよいことが多いです。
whileでループ→ifで分岐など、本当にそれしか無いときだけに限った方がよいです。

また、cshを使う積極的な理由が無いのなら、B-sh系を使うのが一般的です。
対話シェルにcshを使っていても、スクリプトをshで書くことに何の問題もありません

質問中の...続きを読む


人気Q&Aランキング

おすすめ情報