バッチファイルにより、複数のバッチファイルを切り替えて使いたいのですが、条件分岐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文分岐

ドラッグ・アンド・ドロップ(以下、D&D)によるバッチファイルを作成する際にダブルクリックでバッチファイルを開こうとする行為のフェールセーフを考えています。
現状では、以下のバッチファイルにファイルやフォルダをD&Dするとif文の分岐の箇所で終了してしまいます。

有識の方の教授をお願いします。

/* ↓↓ 以下コードです ↓↓*/
@echo off

if "%1"=="" goto error
rem D&Dされたパスを表示
echo %1

echo 終了しました。
goto end

:error
echo このファイルはダブルクリック形式ではありません。
echo ファイルやフォルダをD^&Dして下さい。
pause
exit

:end
exit
/* ↑↑ ここまで ↑↑ */

開発環境
OS:WindowsXP

以上、よろしくお願いします。

Aベストアンサー

XPで長いファイル名の問題ということですから、
コマンドプロンプト用の対策で構わないですかね?

if "%~1"=="" goto error

というふうに%の後に~(チルダ)を入れてください。
パラメータが引用符で囲われているときは引用符が取り除かれます。
パラメータが引用符で囲われていなければそのままです。

%~構文は他にもいろいろあるので
for /?
とか
set /?
とかで表示されるヘルプを読んでみてください。

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秀丸でバッチファイルのコメントに色をつけるには

秀丸を使っています。

バッチファイルを編集するときに
remのあるところ(コメント)に色を付けるには、どうすればよいのでしょうか。

ちなみに、
//(スラッシュ2つ)や /* */の部分は色が付きますが、
どう設定したのかは覚えていません。

Version 4.07 です。
WindowsはXP

Aベストアンサー

秀丸ホームページの強調表示定義ファイルライブラリに
DOS 用のやつが公開されているので、それを読み込んで使うといいと思う。

参考URL:http://hide.maruo.co.jp/lib/hilight/batch.html

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バッチファイルとVBスクリプトの連携エラーコード取得

イベントログにアベンドしたJOBが出力されない場合
せめて、logファイルにだけでも内容を書きたいのですが
うまくいきません。
リターンコードが全部(1)の元バッチファイルで0がかえってきます。
どなたがご教授願います。

(1)親バッチファイルの中味
@echo off
rem==============================================
rem
rem ARG1 = スケジュール日
rem ARG2 = ネットワーク名
rem ARG3 = 終了コード
rem
rem ================================================

set SDATE=%1
set NETWORK=%2
set RC=%3
set SDATE_SHORT=%SDATE:~2,6%
set WK_DIR=D:\temp
set TOML_TXT=%WK_DIR%\toml_%NETWORK%.txt
set VBSCRIPT=D:\stage\tools\bat\GetJobName.vbs

echo ### ARG1(%1) ARG2(%2) ARG3(%3) ###

if "%RC%"=="00" (
echo NETWORK NORMAL END #AUTONEND#
) else (
echo NETWORK ABNORMAL END #AUTONEND#
if exist %TOML_TXT% (
del %TOML_TXT%
)
toml -p999 > %TOML_TXT%
cscript //Nologo %VBSCRIPT% %SDATE_SHORT% %NETWORK% %RC% %TOML_TXT%
)
     if not "%errlrlevel%"=="0" (
set EVT_CRT_RC=%errorlevel%
echo EVETCREATE Failed. RC=%EVT_CRT_RC%
)
)

exit



(2)VBスクリプトの中味
800文字以上になるので、補足要求してください。

(3)イベントログ出力バッチファイルの中味
@echo off
rem
rem 引数
rem %1:SDATE
rem %2:NETWORK
rem %3:RC
rem %4:JOB

set MSG=A-AUTO JOBNET : NETWORK(%2) JOB(%4) SDATE=%1 ABNORMALLY ENDED RC=%3
eventcreate /l application /t error /so autonend /id 999 /d "%MSG%"

exit %errorlevel%

イベントログにアベンドしたJOBが出力されない場合
せめて、logファイルにだけでも内容を書きたいのですが
うまくいきません。
リターンコードが全部(1)の元バッチファイルで0がかえってきます。
どなたがご教授願います。

(1)親バッチファイルの中味
@echo off
rem==============================================
rem
rem ARG1 = スケジュール日
rem ARG2 = ネットワーク名
rem ARG3 = 終了コード
rem
rem ================================================

set SDATE=%1
set NETWORK=%2...続きを読む

Aベストアンサー

(1)の括弧の数が合わないので、どこかに抜けているんだと思いますが、それはさておき、

if aa==aa (
この中で%EE%とか書いた場合、if文の開始前にEEの中身の置換が行われる
)

という仕様にひっかかって、%ERRORLEVEL%が常に0になっているものと思われます。

解決策1:
if の後で ( ) を使わず、goto文を多用する。

解決策2:
先頭に、setlocal enabledelayedexpansion を書いて、( ) 内の変数は !ERRORLEVEL! 等と % でなく ! で囲む。
参考: set /?

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エクセルVBAでテキストファイル(バッチファイルの作成)

エクセルVBA超初心者です。
言語は基本的にC言語しか知りません。

エクセルVBAでボタンを実行したら
たとえば以下のような内容のバッチファイルが
デスクトップに出来る・・・
というものを作らなくてはいけなくなりました。
色々調べてるのですが、ファイル入出力関連の記述の仕方がまったくわからず、あまり時間がなく困っています。

ちなみにバッチファイルの内容は



REM サーバー上からプログラムフォルダをダウンロードする。
XCOPY \\hk001a24\va\data\ツール配信用\セグメント D:\セグメント /I/Y/F/E
REM フォルダへ移動する。
D:
CD D:\セグメント
REM ショートカットをデスクトップに作成する。
csc.exe "D:\セグメント\入力シート.xls" "?desktop?\セグメント入力シート.lnk"
csc.exe "D:\セグメント\出力シート.xls" "?desktop?\セグメント出力シート.lnk"
csc.exe "D:\セグメント\出力帳票" "?desktop?\セグメント出力帳票.lnk"
exit


ここまで。。。
これをボタン実行後、
test.batというファイルに作成しデスクトップに保存する。

似たようなロジックや参考になるURLがあったら教えてください。
長々とすみません、よろしくお願いいたします。

エクセルVBA超初心者です。
言語は基本的にC言語しか知りません。

エクセルVBAでボタンを実行したら
たとえば以下のような内容のバッチファイルが
デスクトップに出来る・・・
というものを作らなくてはいけなくなりました。
色々調べてるのですが、ファイル入出力関連の記述の仕方がまったくわからず、あまり時間がなく困っています。

ちなみにバッチファイルの内容は



REM サーバー上からプログラムフォルダをダウンロードする。
XCOPY \\hk001a24\va\data\ツール配信用\セグメント D:\セグ...続きを読む

Aベストアンサー

Sub MakeBat()
Dim n As Long
Dim DesktopPath As String

n = FreeFile

DesktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop")

Open DesktopPath & "\Test.bat" For Output As #n
Print #n, "Rem サーバー上からプログラムフォルダをダウンロードする。"
Print #n, "XCOPY \\hk001a24\va\data\ツール配信用\セグメント D:\セグメント /I/Y/F/E"
Print #n, "Rem フォルダへ移動する。"
Print #n, "D:"
Print #n, "CD D:\セグメント"
Print #n, "Rem ショートカットをデスクトップに作成する。"
Print #n, "csc.exe ""D:\セグメント\入力シート.xls""; ""?desktop?\セグメント入力シート.lnk"""
Print #n, "csc.exe ""D:\セグメント\出力シート.xls"" ""?desktop?\セグメント出力シート.lnk"""
Print #n, "csc.exe ""D:\セグメント\出力帳票"" ""?desktop?\セグメント出力帳票.lnk"""
Print #n, "exit"
Close #n
End Sub

Sub MakeBat()
Dim n As Long
Dim DesktopPath As String

n = FreeFile

DesktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop")

Open DesktopPath & "\Test.bat" For Output As #n
Print #n, "Rem サーバー上からプログラムフォルダをダウンロードする。"
Print #n, "XCOPY \\hk001a24\va\data\ツール配信用\セグメント D:\セグメント /I/Y/F/E"
Print #n, "Rem フォルダへ移動する。"
Print #n, "D:"
Pri...続きを読む

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

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

Aベストアンサー

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

Qバッチファイルに詳しい方、お願い致します。

upload.txtファイルをupload.batにして動かしたいのですが、送付画像のようになって動いてくれません。
FTPアップロードを自動化したいんです。

以下が、そのファイルの中身なんですが、どこをどう直せばいいですかね?
やりたい事は、imagesのフォルダ内にあるfolder00001などの画像ファイルをLhaplusと7-Zipを使ってアップロードしたいんです。



@echo off


rem /* 画像のあるフォルダに移動してフォルダ内の画像を圧縮して */
rem /*
rem /* ftpcmdに記載のFTP情報でサーバーに接続して圧縮ファイルをアップロードするバッチファイル */
rem /*
rem /* 【必須条件】
rem /* (1) 7-zipをC:\にインストールしておきます
rem /* (2) ftpyahoo.txt にFTP接続先情報を設定します
rem /* 1行目の "open" の後ろにサーバー名
rem /* 2行目にストアアカウント名
rem /* 3行目にヤフーから通知されたFTPパスワード
rem /*
rem /* 【バッチファイルの設置場所】
rem /*
rem /* アップロードしたい画像が入っている各フォルダの1つ上の階層に置いてください */
rem /* (ftpcmdもこのバッチファイルと同じ階層に置いてください) */
rem /*
rem /* 例:
rem /* デスクトップ\ヤフーショップ\upload.bat
rem /* \ftpcmd
rem /* \images\画像が収容されている各フォルダ(複数)
rem /*
rem /* ※上記の構成で "images"を移動先フォルダに設定します。
rem /*
rem /*----------------------------------------------------------

rem ここに各画像フォルダが収容されているフォルダを指定します(変更が必要)

set topdir=images


rem ここでLhaplus.exeへのパスを設定(スタートからLhaplusを右クリック→プロパティ、で
rem 表示される「リンク先」の内容を貼り付ける

"C:\Program Files (x86)\Lhaplus\Lhaplus.exe"

rem アップロードする際の圧縮ファイルの名前

set zipfile=img.zip


set curdir=%~dp0

echo %curdir%

rem 画像各フォルダの1つ上に移動
cd %topdir%

for /D %%a in (*) do (

rem 画像フォルダに移動

echo "画像フォルダ:"
echo %%a
cd %%a


rem 入っている画像をまとめて圧縮する

"C:\Program Files (x86)\7-Zip\7z.exe" a "%curdir%\img.zip" *.jpg

rem 圧縮したzipファイルをFTPする

echo "%curdir%ftpinfo.txt"
ftp -s:"%curdir%ftpyahoo.txt"


del "%curdir%\img.zip"

timeout /t 600

cd ..


rem 戻る

)

echo "完了しました"

upload.txtファイルをupload.batにして動かしたいのですが、送付画像のようになって動いてくれません。
FTPアップロードを自動化したいんです。

以下が、そのファイルの中身なんですが、どこをどう直せばいいですかね?
やりたい事は、imagesのフォルダ内にあるfolder00001などの画像ファイルをLhaplusと7-Zipを使ってアップロードしたいんです。



@echo off


rem /* 画像のあるフォルダに移動してフォルダ内の画像を圧縮して */
rem /*
rem /* ftpcmdに記載のFTP情報でサーバーに接続して圧縮フ...続きを読む

Aベストアンサー

@echo off を消せば、実行するコマンドが表示されるはずです。
コメントアウトがうまくいってないのなら、
@echo on
に書きかえてもいいです。

例えば
echo "画像フォルダ:"
 は、echo off では

画像フォルダ:

 と表示されるだけですが、 echo on の状態だと

C:¥〜> echo "画像フォルダ:"
画像フォルダ:

という感じに、コマンドとその結果という感じになるはずです。

> どの部分の事かお分かりになりますか?
については、

C:¥〜> なんかのコマンド
指定されたパスがみつかりません

という感じになっていませんか?

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ランキング