Update: 2011/05/21 本サイトは「tsg21.com」に移動します。バッチファイルの覚書となりますのでよろしくお願いします。

コマンドプロンプトでバッチ処理を行うときの覚え書き

 コマンドプロンプトは、Windowsで標準そうびされているCUIベースのプログラム実行環境で、バッチファイルと呼ばれる、拡張子が「.bat」であるテキストファイルに簡単なプログラミング(コマンドの実行手順を記述すること)で定型的な処理の自動化を実現することができます。
 バッチファイルによる処理のメリットは、処理の途中に人手を介さない(たとえば、多量のファイルコピーなど)処理は、ほぼ完全に自動で行えることで、手作業の負担を減らすことができます。
 (通常のGUIのプログラムのように、処理対象となるファイル名の選択や、ウィンドーサイズの変更、処理オプションの設定などは、バッチ処理では普通行いません。)
 ここには、Windows 2000以降に拡張されたコマンドを中心に度忘れしそうな事柄や汎用的に使えそうなスクリプトの雛形などを置いておくことにします。
 あまり役に立たないかも知れませんが、自由に利用してください。

バッチコマンドについて

 コマンドの詳細な説明は、「コマンド /?」 で表示できます。
例)dir /?
 以下のバッチ(例えば、help.batとする)を実行すると、入力したコマンドの説明をファイルに残せるので便利かも...
(メモ帳を起動し、下の2行を入力して「help.bat」という名前で保存します。)
set /p cmd=コマンド名:
%cmd% /? >%cmd%.txt 2>&1
(「help.bat」をダブルクリックしてコマンド名を入力すると、コマ ンドの説明がテキストファイルで保存されるので、作成されたファイルをメモ帳などで開いて説明を読みます。)

SETコマンド

SETコマンドは、環境変数を設定したり削除できますが、その他に計算やキーボード入力を受け付けることも出来ます。
使い方)
SET src="C:\Documents and Settings\PC-user\My Documents\C\Source" → 変数の設定
SET /A x += 1 → 計算
SET /P f=ファイル名を入力してください: → キーボード入力
なお、漢字・ひらがなを入力するには[ALT]+[半角/全角]([ALT]を押した状態で[半角/全角]を押します。)でローマ字かな入力モードにできます。 ローマ字かな入力を抜けるには、もう一度、[ALT]+[半角/全角]を押します。
SET /P の応用として、改行しないで文字列を表示させる(ECHOの代用)こともできます。
SET /P ダミー変数=表示文字列<nul

ECHO で改行だけをさせるには

ECHO. ECHO= ECHO: ECHO/ ECHO+ など ECHO の直後に記号を入れることで改行動作だけを行うことができます。

リダイレクトとパイプ

リダイレクトは、標準入力や標準出力をファイルに割り当てる仕組みで「<」記号でファイルから標準入力へ「>」または「>>」記号で標準出力をファイルへ接続します。
「>」は出力ファイルを常に新規作成しますが、「>>」は既存のファイルが存在する場合には、データの追加動作となります。
また、2>ファイル名 とすることで、標準エラー出力(エラーの画面表示)をファイルに書き出すこともできます。
例)標準入力をファイルに割り当てます。
   find "パソコン" <data.txt または find "パソコン" 0<data.txt
例)標準出力をファイルに割り当てます。
   echo "コマンドプロンプト" >new.txt または echo "コマンドプロンプト" 1>new.txt
例)追加モードでファイルに出力します。
   echo "パソコン、プリンタ" >>new.txt または echo "パソコン、プリンタ" 1>>new.txt
例)標準出力と標準エラーをファイルに書き出します。
   dir /? 1>bat.log 2>1
上記の例から分かるとおり
 標準入力の装置番号=0
 標準出力の装置番号=1
 標準エラー出力の装置番号=2
となっています。

パイプは、標準出力のデータを次のコマンドへの標準入力につなぐ仕組みです。
例)type data.txt|more
(type コマンドで data.txt の内容を読み出して more に引渡し、ページ単位で表示します。)
バッチファイルでリダイレクト記号(<, >)やパイプ記号( | )を通常の記号として使いたい場合は、「^」でエスケープできます。
例えば、HTMLのタグを記述するには、「^<p^>」のようにします。
また、その他の特殊記号についても「^\」「^%」「^!」「^"」「^&」「^^」などと記述して特殊記号の機能を無効にすることができます。

IFコマンドの構文

IF 条件 コマンド
IF 条件 コマンド ELSE コマンド
IFコマンドの条件文
"文字列/変数" 条件演算子 "文字列/変数"
変数/数値 条件演算子 変数/数値
【条件演算子】
GTR (右の値)より(左の値が)大きい
LSS (右の値)より(左の値が)小さい
GEQ (右の値)以上
LEQ (右の値)以下
EQU (右の値)と等しい
==  等しい
NEQ 等しくない
NOT (右の値)でない
DEFINED (変数が)定義されている=値を持っている
EXISTS (右で指定された)ファイルが存在する
ERRORLEVEL エラーレベル(%ERRORLEVEL%)の値

コマンドのブロック化

コマンドプロンプトでは、複数のコマンドをひとまとめにして処理をすることができます。
|」 パイプによる連続処理
   例)find "," myfile.txt|more
「&」 コマンドの連結
   例)pushd & cd .. & dir & popd
   「&」の前後にスペースを入れるとスペースを含めてコマンドを解釈するようです。
   そのため、「&」の前後にスペースは入れないほうが良いようです。
( ) によるブロック化(バッチ用)
   例)
   if ERRORLEVEL 1 (
       echo コマンドの実行に失敗しました。
       echo ファイル「%FL%」が存在するか、確認してください。
       rem goto :EOF でバッチ処理を終了します。
       goto :EOF
   )

CALLコマンド

従来のCALLコマンドは外部のバッチファイルを読み込んでサブルーチンとして実行するものでしたが、現在はラベルを指定して、 バッチファイル内に記述したサブルーチンを呼び出すことも出来るようになっています。
サブルーチンから呼び出し元にもどるときに、「EXIT /B 整数」と記述することで、整数値を返すことが出来ます。
例)
if "%obj%" == "" CALL :obj


:obj
 set /p obj=OBJのパスを入力してください。: 
 if "%obj%" == "" set obj="%HOMEDRIVE%%HOMEPATH%\My Documents"
exit /b

FORコマンドは、いろいろな使い方ができます。

for %%変数 in (ファイルリスト) do コマンド
ファイルリストに含まれるファイル名を1つづつ %%変数(FOR変数)に取り出し、コマンドを実行します。
バッチで for を使うときは、FOR変数を %%変数 のように % を2つ並べなければなりません。
例)for %%I in (*.txt) do findstr "日本.+技術" %%I
for /D %%変数 in (ファイルリスト) do コマンド
ファイルリスト中のサブディレクトリ(サブフォルダー)だけを取り出しコマンドを実行します。

for /R ドライブ:パス %%変数 in (ファイルリスト) do コマンド
ドライブ:パスで指定されたディレクトリーから順にサブディレクトリを検索し、ファイルリストに指定されたファイル名に一致するものを%%変数に取り出し てコマンドを実行します。

for /L %%変数 in (開始数, 増加数, 終了数) do コマンド
開始数、増加数、終了数で指定される回数でコマンドを繰り返します。
%%変数には、開始数、増加数で計算された数が設定されます。
例)for /L %%I in (10, -3, 0) echo %%I

for /F "オプション" %%変数 in (ファイルリスト) do コマンド
ファイルリストに含まれるファイルから行を読み出し、指定の区切り符号までのデータ(文字列)を%%変数に取り出してコマンドを実行します。
※指定のファイルから行単位でデータを読み出して処理を行えます。
オプション
eol:行の終了を表す文字を指定します。例えば、「eol=#」とすることで、「#」で始まる行をコメント行とみなします。
skip:ファイルの先頭から読み飛ばす行数を指定します。
tokens:区切り符号で分割された文字列の位置を指定して取り出します。(指定しなければ1番目)
"tokens=2,4-6*" %%D とすると、%%D に2番目の文字列、 %%E に4番目、 %%F に5番目、 %%G に6番目、 %%H に残りのすべての文字列が設定されます。
なお、%%E、%%F、%%G、%%Hは暗黙で自動的に作成される変数です。
delims:区切り符号を変更します。(指定しなければ、半角空白(スペース)です。)
区切り符号を無効にするには、"skip=1 delims=" のように「"」の直前にdelims=を記述します。
例)for /F "tokens=* delims=" %%L in (access.log) do set /a ln+=1
tokens=* で行全体を %%L に取り込みます。delims=で区切り符号を無効にします。
この処理で 「access.log の行数」を求めます。

for /F "オプション" %%変数 in ('コマンド') do コマンド
'コマンド'の出力結果から指定の区切り符号までの文字列を%%変数に取り出してdo コマンドを実行します。
'コマンド 引数1 引数2 ・・・ ' という形で引数を与えることができますが、'コマンド "文字列"' という形の引数を与えることはできません。
オプションは、上に同じ
例)for /F "tokens=* delims=" %%I ('type cpy.lst') do copy %%I myfolder
cpy.lst から読み出されたファイル名に該当するファイルだけ myfolder にコピーします。

for /F "オプション" %%変数 in ("文字列") do コマンド
文字列をファイルからの入力行として%%変数に取り出してコマンドを実行します。
オプションは上に同じ
例)for /F "tokens=1-3 delims=/" %%D in ("%date%") do echo %%D年%%E月%%F日

for /F "usebackq オプション" %%変数 in (`コマンド "文字列"`) do コマンド
`コマンド "文字列"` を実行し結果の文字列を区切り符合で分割して変数に取り出し、do コマンドを実行します。
オプションは上に同じ
この構文では、`コマンド`の引数に"文字列"を与えることができます。
例)for /F "usebackq tokens=*" %%I in (`dir /b /a-d "my music"`) do set /a n+=1

PUSHDとPOPD

コマンドプロンプトを使うときにカレントディレクトリ(基準となる現在のディレクトリ)を一時的に変更したい場合があります。
こんなときは、
PUSHD → 現在のディレクトリをスタック(システムが用意している退避領域)に保存します。
POPD → スタック(システムが用意している退避領域)に保存したディレクトリを取り出してそこに移動します。

ページトップへ戻る

バッチ処理がうまく動かないとき

コマンドのつづりが間違っているとか文法(使い方)が間違っている場合は、実行時にエラーメッセージが出ますからこれを確認しま す。
エラーはでないけれど実行が途中で止まる、または結果がおかしい場合は、適宜 echo on を入れて動作の状況を確認します。
どうしても、エラーが見つからないときは、
| や & や ( ) による処理のブロック化 および FORコマンド内での変数の取り扱いを見直してみてください。
例えば、次の記述は正常に実行されますが、下の記述は予想通りには実行されません。
if "%par%" == "" set /p par=引数を設定してください:
if "%par%" == "" goto :EOF

if "%par%" == "" (
set /p par=引数を設定してください:
if "%par%" == "" goto :EOF
)

( )の中はひとまとまりのコマンドとみなされるため、 ifコマンドの%par%はどちらも ( ) の実行前の値(つまり"")で置き換えられているため、setコマンドで変数parを設定しても ifコマンドの判定は常に "" == "" となってしまい処理を終了します。
( )やFORコマンドの内での変数の変更とIFコマンドの判定には特に注意が必要です。
この問題を修正するには、ア.遅延環境変数を有効にする方法とイ.CALLコマンドを使う方法があります。

ア.遅延環境変数を使う方法
遅延環境変数とは、コマンド行の実行時に変数を展開する動作のことです。
(SETコマンドの説明を参照)
遅延環境変数を使うには、コマンドプロンプトの起動時に /V オプションをつけるか、バッチファイル中で SETLOCAL ENABLEDELAYEDEXPANSION を宣言します。
使い方は、実行時に展開したい変数を ! で挟むだけです。
上の例では以下のように ( ) 内の IFコマンドを変更します。
SETLOCAL ENABLEDELAYEDEXPANSION → SETLOCALで遅延環境変数を設定
if "%par%" == "" (
set /p par=引数を設定してください:
if "!par!" == "" goto :EOF
)
ENDLOCAL → SETLOCAL設定の解除

イ.CALLコマンドによる修正
最初のifで ( ) による処理のブロック化を行わず、処理をサブルーチン化してCALLで呼び出します。
if "%par%" == "" CALL :set_par
if err EQU 1 goto :EOF
 ・
 ・
:set_par
set /p par=引数を設定してください:
if "%par%" == "" set /a err=1 else set /a err=0
exit /b

数値計算時の注意
数値計算を行うときは、表示の桁数を合わせるために
set n=7
set /a x=%n%+100
set x=%x:~-2%
のように0を付加する処理をよく行います。
ところが、普通は10進数として扱われる数字ですが、先頭が0で始まっている場合は、「8進数」と解釈されてしまいます。
「010」は10進数で「8」、「014」は10進数で「12」と解釈されますし、「08」や「09」などは8進数では使えない数字「8」「9」が含まれるのでエラーとなります。
桁揃えを行うのは表示の直前に行い、計算用の変数と表示用の変数を分けたほうがいいと思います。
また、setコマンドの説明にもありますが、「0x41」のように数字を「0x」で始めると16進数として扱われます。
さらに、バッチ処理では数値を2進数32桁(32bit)で2の補数形式を使って計算するようになっているのですが、コマンドプロンプトにはオーバーフローという概念が無いらしく、計算の結果が2進数32桁を超えても32桁内で計算をし続けようとします。
(例)
set /a x=2147483647+1 → -2147483648
set /a x=1073741824*2 → -2147483648
set /a x=-2147483648*2 → 0
などとなります。
10億を超える計算をするときは、計算の途中経過にも注意が必要です。

2の補数形式とは、2進数の桁数を固定(ここでは16桁:16bitとします。)し、(0000000000000000)2を基準(「0」とします。)としてここから1を引いた値(1111111111111111)2(=17桁目から桁借りをしたと考えます。)を-1と定める表現形式をいいます。
このため、正の数の上限を(0111111111111111)2=65535、負の数の下限を(1000000000000000)2=-65536と定め、最上位の桁(MSB)を符号ビットとして扱います。

環境変数に改行文字を入れる方法

ECHO で複数行(改行を含めて)表示をさせたいときは、改行文字だけの環境変数を作っておくと便利です。

SETLOCAL ENABLEDELAYEDEXPANSION
rem (改行)は3つ続けます。
rem (^でエスケープされた最初の改行が2つ目の改行でLFに保存され、3つ目の改行でSETコマンドが終わります。)
SET LF=^(改行)
(改行)
(改行)
SET str=文字列!LF!次の文字列
ECHO !str!
ENDLOCAL
rem 環境変数の遅延展開を使うのがポイントです。

参考文献

http://otnx.jp/CMD/FrontPage/
http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html

ページトップへ戻る

サンプルプログラム

バッチコマンドでの日付/時間処理
時間計算
 指定された時刻と経過時間(秒数)から時刻を求めます。
 経過時間には負の数も使えます。また、日をまたぐ場合は、環境変数 dd に日数を格納します。
@rem-----------
@title 時間計算
@echo off
set hms=%~1
if "%hms%" == "" set /p hms=24時間形式(hh 00~23)で時刻を入力してください。(hh:mm:ss):
if "%hms%" == "" set hms=%TIME:~0,8%
for /f "tokens=1-3 delims=:" %%D in ("%hms%") do set /a hou=%%D&set /a min=%%E&set /a sec=%%F
set /a ps = hou * 3600 + min * 60 + sec
echo 00:00:00からの通算秒数:%ps%[s]
pause
set ts=%~2
if "%ts%" == "" set /p ts=経過秒数を入力してください。:
if "%ts%" == "" set /p ts=0
set /a ps += ts
if %ps% GEQ 0 set /a dd=ps / 86400
if %ps% LSS 0 set /a dd=ps / 86400 - 1
set /a ps -= dd * 86400
set /a hh = ps / 3600
set /a ps -= hh * 3600
set /a mm = ps / 60
set /a ps -= mm * 60
set /a ss = ps
echo 求める時間は %dd%日%hh%時%mm%分%ss%秒 です。
pause
echo on
@exit/b
@rem --------------------ここまで

日付の計算
 指定された日付と経過日数から日付を求めます。
 経過日数は負の数も使えます。
@rem --------------------ここから
@TITLE 日付計算(1)
@echo off
set dt=%~1
if "%dt%" == "" set /p dt=日付を入力してください。(yyyy/mm/dd):
if "%dt%" == "" set dt=%date%
set dt=%dt:~-10%
echo date=%dt%
for /f "tokens=1-3 delims=/" %%D in ("%dt%") do set y=%%D&set m=%%E&set d=%%F
rem 月数と日数の頭の0(01,02..08,09の0)を外す処理
set m=10%m%
set /a m=m-(m/100)*100
set d=10%d%
set /a d=d-(d/100)*100
set /a pd = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400
call :set_md
rem CALLコマンドの環境変数の展開が2段階であることを利用して配列風の使い方をしています。
rem CALLで呼び出されたコマンドは文法チェックを行われ、この段階で1度目の変数展開が行われます。
rem 次に、呼び出されたコマンドの実行段階で、再度変数の展開が行われます。
rem 結果、m = 4 の場合、文法チェックの段階で、call set /a od = %md[4]% と展開され、
rem さらに実行段階で、set /a od = 90 に展開されます。
call set /a od = %%md[%m%]%%
set /a od += %d%
set /a u=0
if %m% GTR 2 call :uruu
set /a td = pd + od + u
echo 西暦1年1月1日(月)からの通算日数:%td%[日]

set days=%~2
if "%days%" == "" set /p days=%dt%からの経過日数:
if "%days%" == "" set /p days=0
set /a td += days
rem 365.2425 * 400 = 146097; 閏年を考慮した西暦年数への換算数
rem (td * 400 - 1) の -1 は400年に1度、146097(365.2425)で割り切れる日数になるのでこれを回避しています。
set /a y = (td * 400 - 1) / 146097
set /a yd = td - (y * 146097) / 400
set /a y+=1
set /a u=0
call :get_m
set /a d=yd
rem 0で桁を揃えるためのダミー計算です。
set /a y=10000+y
set /a m=100+m
set /a d=100+d
call :set_wkday
set /a weekday=td - (td / 7) * 7
call set w=%%wd[%weekday%]%%
rem %y:~1,4% で2桁目から4桁分の文字列を取り出しています。
echo 求める日付:%y:~1,4%/%m:~1,2%/%d:~1,2% [%w%]
pause
@echo on
@exit/b

rem -----ここからサブルーチン
rem 年が閏年かどうかを判定し、年初からの日数(yd)をもとに月(m)と日(yd)を計算します。
rem 閏年の場合、無条件に yd から閏日の1日を引いておき、月が1月、2月であった場合に閏日を1日戻し入れしています。
:get_m
    call :uruu
    if %u% EQU 1 set /a yd-=1
    if %yd% GTR 334 set /a yd=yd - 334&set /a m=12&goto :EOF
    if %yd% GTR 304 set /a yd=yd - 304&set /a m=11&goto :EOF
    if %yd% GTR 273 set /a yd=yd - 273&set /a m=10&goto :EOF
    if %yd% GTR 243 set /a yd=yd - 243&set /a m=9&goto :EOF
    if %yd% GTR 212 set /a yd=yd - 212&set /a m=8&goto :EOF
    if %yd% GTR 181 set /a yd=yd - 181&set /a m=7&goto :EOF
    if %yd% GTR 151 set /a yd=yd - 151&set /a m=6&goto :EOF
    if %yd% GTR 120 set /a yd=yd - 120&set /a m=5&goto :EOF
    if %yd% GTR 90 set /a yd=yd - 90&set /a m=4&goto :EOF
    if %yd% GTR 59 set /a yd=yd - 59&set /a m=3&goto :EOF
    if %yd% GTR 31 set /a yd=yd - 31 + u&set /a m=2&goto :EOF
    set /a yd+=u&set /a m=1
goto :EOF

rem 与えられた年が閏年かどうかを検査します。閏年なら u = 1 、閏年でなければ u = 0 です。
:uruu
    call :remainder %y% 400
    if %remainder% EQU 0 set /a u=1&goto :EOF
    call :remainder %y% 100
    if %remainder% EQU 0 set /a u=0&goto :EOF
    call :remainder %y% 4
    if %remainder% EQU 0 set /a u=1&goto :EOF
    set /a u=0
goto:EOF

rem 年数を400, 100, 4 で割ったときの余りを求めるサブルーチン
:remainder
    set /a remainder = %1 - (%1 / %2) * %2
exit /b %remainder%

rem 年の初めから各月の初めまでに経過している日数
:set_md
    set /a md[1]=0
    set /a md[2]=31
    set /a md[3]=59
    set /a md[4]=90
    set /a md[5]=120
    set /a md[6]=151
    set /a md[7]=181
    set /a md[8]=212
    set /a md[9]=243
    set /a md[10]=273
    set /a md[11]=304
    set /a md[12]=334
exit /b

rem 曜日を設定します。
:set_wkday
    set wd[0]=日
    set wd[1]=月
    set wd[2]=火
    set wd[3]=水
    set wd[4]=木
    set wd[5]=金
    set wd[6]=土
exit /b
rem ---------------------ここまで

ページトップへ戻る

ファイルの拡張検索
 指定のディレクトリーや拡張子のテキストファイルの内容を検索し、一致するデータを含む行、またはファイル名を表示します。
 検索ワードに一致するデータを含む行またはファイル名の一覧をファイルに出力することもできます。
@rem --------------------ここから
@TITLE 拡張検索
@echo off
REM 検索用パラメータを入力します。
SET /P d=検索ディレクトリー:

REM 検索先のディレクトリーが指定されなかった場合は使い方の表示を行います。
IF "%d%" == "" GOTO comments

SET /P s=検索キーワード:
SET /P o=オプション(/S /M 出力ファイル名):

REM オプション(/M:ファイル名の表示,/S:サブディレクトリの検索など)の文字列を分割します。
FOR /F "tokens=1-3*" %%O IN ("%o%") DO CALL :set_par %%O %%P %%Q %%R

REM 検索文字列を「"」で括ります。(もともと「"」が使われていた場合は、元の「"」を削除します。)
SET wk=%s:"=%
SET s="%s%"
IF "%wk:~0,3%" == "/C:" SET s=/C:"%wk:~3%"
IF "%wk:~0,3%" == "/c:" SET s=/C:"%wk:~3%"

REM 検索文字列が指定されていなかった場合は、空白行でないすべての行に一致させます。
IF %s% == "" SET s="."
echo 検索語:%s%

REM ディレクトリーコマンドからファイル名を受け取り、検索処理に引渡します。
FOR /F "usebackq tokens=*" %%F IN (`dir /B /A-D %m0% %d%`) DO (
    REM DOS標準の外部コマンドで検索を行います。
    findstr /R /P %m1% %m2% %s% "%%F" %m3%
)
pause
echo on
@exit /b

:set_par
    REM 検索用のパラメーターを整理し設定します。
    REM m0:/Sスイッチが指定されたときに「SET m0=/S」が設定されます。
    REM m1、m2:/Mスイッチが指定されたときにm1またはm2に「/M」が設定されます。
    REM m3:「/」でない文字から始まった場合、検索結果の出力用ファイル名と解釈されます。
    REM m4:予備の引数です。
    SET m0=
    SET m1=%~1
    SET m2=%~2
    SET m3=%~3
    SET m4=%~4
   
    REM sub*の処理で引数の順序を変更します。
    IF NOT "%m1:~0,1%" == "/" GOTO sub1
    IF NOT "%m2:~0,1%" == "/" GOTO sub2
    IF NOT "%m3:~0,1%" == "/" GOTO sub3
    IF NOT "%m4:~0,1%" == "/" GOTO sub4
        set m1=%~1
        set m2=%~2
        set m3=%~3
        set m4=%~4
    :ret1
   
    REM m1またはm2に/Sが設定されていたら、m0に設定を変更します。
    IF "%m1%" == "/S" SET m0=/S & SET m1=
    IF "%m1%" == "/s" SET m0=/S & SET m1=
    IF "%m2%" == "/S" SET m0=/S & SET m2=
    IF "%m2%" == "/s" SET m0=/S & SET m2=
   
    REM m1に/Mが設定されていたら、m2を空に変更します。
    IF "%m1%" == "/M" SET m2=
    IF "%m1%" == "/m" SET m2=
   
    REM m2に/Mが設定されていたら、m1を空に変更します。
    IF "%m2%" == "/M" SET m1=
    IF "%m2%" == "/m" SET m1=
   
    REM m3が半角/全角のスペースで始まっている場合、m3を空にします。
    IF "%m3:~0,1%" == " " SET m3=
    IF "%m3:~0,1%" == " " SET m3=
exit /b

:sub1
    REM 引数の1番目と3番目を入れ替えます。
    set m1=%~3
    set m2=%~2
    set m3=%~1
    set m4=%~4
GOTO ret1
:sub2
    REM 引数の2番目と3番目を入れ替えます。
    set m1=%~1
    set m2=%~3
    set m3=%~2
    set m4=%~4
GOTO ret1
:sub3
    REM 入れ替えはありません。
    set m1=%~1
    set m2=%~2
    set m3=%~3
    set m4=%~4
GOTO ret1
:sub4
    REM 引数の4番目と3番目を入れ替えます。
    set m1=%~1
    set m2=%~2
    set m3=%~4
    set m4=%~3
GOTO ret1

:comments
echo 検索対象のディレクトリーおよびサブディレクトリーにある(テキスト)ファイル
echo を検索キーワードで検索しキーワードに一致する行やファイル名を表示します。
echo (使い方) %~nx0
echo  検索ディレクトリー、検索キーワード、(検索)オプションを順次入力します。
echo  検索ディレクトリーを入力しなかった場合は、説明画面(この画面)が表示され
echo  ます。
echo  検索ディレクトリーは、絶対パスまたは相対パスで指定します。
echo   . → 現在のディレクトリー、
echo   .. → 1つ上位の(親)ディレクトリー
echo  検索キーワードには、正規表現が使えます。
echo   . → 任意の1文字
echo   [文字リスト] → 文字リストに含まれている1文字
echo   [^^文字リスト] → 文字リストに含まれていない文字
echo   [a-z] → 範囲で指定された文字リスト
echo   [a-zA-Z0-9_] 英数字と「_」
echo   [^^a-zA-Z] 英字でない文字(数字、記号、スペースなど)
echo   \\ → \記号
echo   \^^ → ^^記号
echo   \$ → $記号
echo   ^^ → 行頭
echo   $ → 行末
pause
echo  検索キーワードの例
echo   "使い方" → 「使い方」という文字列を指定します。
echo   "使い方 方法"→「使い方」または「方法」という文字列を指定します。
echo   [sS]et → 「set」または「Set」という文字列を指定します。
echo   <script.*type= → 「<script(任意の文字列)type=」を指定します。
echo   /C:"input type"「input type」という文字列を指定します。
echo    なお、半角英字の大文字、小文字は区別されます。
echo  オプション
echo   /M → キーワードに一致するデータを含むファイルの名前だけを表示します。
echo   /S → サブディレクトリーも含めて検索します。
echo   出力ファイル → 検索結果を出力ファイルに書き出します。
pause
echo on
@exit /b
@rem --------------------ここまで

自己消去処理(自殺処理)
 自分で自分自身のファイルを削除(自殺)する処理です。
 ファイルの最後に DEL コマンドを入れておけばいいのですが、ここではスクリプトを使ってDEL コマンドを追加しています。
@rem --------------------ここから
@title 自己消去(自殺処理) @echo off
set fn=%0
rem ここで、ファイルの最後に DEL コマンドを追加します。
echo del %fn% >>%fn%
pause
echo on
@rem --------------------ここまで

この例のようにBAT ファイルは、自分自身を含めてファイルの書き換えができてしまいます。



ページトップへ戻る



【ページ内見出し】
◆ページトップ
◆バッチコマンドについて
◆SETコマンド
◆ECHO で改行だけをさせるには
◆リダイレクトとパイプ
◆IFコマンドの構文
◆コマンドのブロック化
◆CALLコマンド
◆FORコマンドは、いろいろな使い方ができます。
◆PUSHDとPOPD
◆バッチ処理がうまく動かないとき
◆環境変数に改行文字を入れる方法
◆参考文献
◆サンプルプログラム
◆時間計算
◆日付の計算
◆ファイルの拡張検索
◆自己消去処理(自殺処理)
【サイト内リンク】
■xcopyバックアップ
■バッチサンプルの使い方
■バッチサンプル(その1)
■バッチサンプル(その2)
■バッチで使うVBscript
■インデックスページ
■サイトトップページ


広告エリア
☆缶コーヒーはいかが☆


元のページに戻る  ページを閉じる

連絡先:お問い合わせフォーム