DOSバッチファイル メモ

 windows バッチファイルを使うことが何回かあるのでそのメモ

DOSコマンドメモ

参考サイト

マイクロソフト本家 : コマンド ライン リファレンス

コマンドプロンプトの使い方

コマンドスクリプトで起動時の引数の個数を数える - 虎塚

Windowsバッチファイル引数 CapmNetwork

  • 名前変更
rename 対象のファイル名 新しいファイル名

rename = renなのでrenでのOK

ディレクトリ配下の特定のファイル名のみ名前変更したい場合は、ワイルドカードが使用可能。例えば拡張子txtをbinに変えたい場合

rename *.txt *.bin
ren text.txt "テキスト ファイル".txt

スペースが入る場合は""で括らないと上手く動作しない

  • 日付取得

C:\>echo %date%

2014/12/30

C:\>echo %time%
22:53:04.95

日時を加工して、一部の文字列だけ抽出してファイル名にする場合には、

例えば、生年月日_時間_分.txtというファイルを作りたいとき

echo %date% >  %date:~5,2%%date:~8,2%_%time:~0,2%_%time:~3,2%.txt

とすればよい。%date:~5,2%は%date%の6文字目(0番目,1番目と数える)から2文字表示すると言う意味。

  • ディレクトリ移動

cd /d 移動したいディレクトリ名

/dはドライブを移動する場合に必要なオプション

  • 引数

バッチファイルを作る時に使うことが多い。これを使える様になると色々とバッチファイルで出来ることが広がる。

マイクロソフトのマニュアルページでは

Cmd.exe には、バッチ パラメータ展開変数 %0 ~ %9 があります。バッチ ファイルでバッチ パラメータを使用する場合、%0 はバッチ ファイル名で置き換えられ、%1 ~ %9 はコマンド ラインで入力するそれぞれの引数で置き換えられます。%9 を超えて引数にアクセスする場合は、shift コマンドを使用する必要があります。shift コマンドの詳細については、「Shift」を参照してください。バッチ パラメータ %* は、バッチ ファイルに渡される %0 を除くすべての引数を参照するワイルドカードです。コマンドプロンプト上にメッセージ表示

と書かれている。

バッチファイル名 引数1 引数2 ... 引数9

と入力すると、%1から%9にそれぞれ引数1から引数9が渡される。

cmd.bat内で

xcopy %1\*.* %2

とバッチファイルを作り、コマンドライン

cmd.bat D:¥CopyTarget D:¥CopyDest

とすれば、CopyTarget -> CopyDestへのファイルコピーが出来る。

10以上の引数を渡す場合はshiftコマンドを使用して、

cmd.bat内で

echo %0 %1 %2 %3 %4 %9

shift /2

echo %0 %1 %2 %3 %4 %9

として

cmd.bat a b c d e f g h i j k l m n

> %PATH%¥cmd.bat a b c d i

> %PATH%¥cmd.bat a c d e j

となる。 /n でn番目の文字列から1文字左へシフトする。20個の引数がある場合は10回shiftコマンドを発行することになる。shiftで消えた引数は復旧出来ないので必要ならば

setコマンドで別の変数に退避しておく。

  • ファイル出力

コマンド名 > 出力ファイル名

  • ファイル読み込み

あるtext.txtの文字列を読み込んで表示する方法。FORを使う

for {%Variable | %%Variable} in (Set) do Command [CommandLineOptions]

Setの内容を%%Variableに入力する。

Set = PATH¥text.txt

とすればテキストファイル内を1ラインずつ読み込んでくれる。

Set = Dir /a-s /on /b

とすればディレクトリ下にあるファイルを一つずつ処理する時に使える。

for /F "tokens=2,3*" %%a in (C:¥text.txt) do (

 echo %%a %%b

)

text.txt内のスペース、タブで区切られた文字列をトークンとして、2番目と3番目以降のトークンをまとめたものをそれぞれ%%aと%%bに入れる。

コマンド上からforを使う時は%a、バッチファイルで使う時は%%b

ループ内でカウンタを使用したい場合

SET X=0

SET Y=10000

setlocal enabledelayedexpansion

for /F "tokens=1,2*" %%a in (C:¥text.txt) do (

:: echo %%b

SET /a X=!X!+1

echo %Y:~1%!X!

)

endlocal

とする必要がある。通常の四則演算では思った通りにカウントアップされない。

この結果は

0001

0002

0003

....

という形になる。

 

20150104追記

  • 実行コマンドを表示しない

echo off

をバッチファイルの先頭に記述するとバッチファイル実行時に実行したコマンドがコマンドプロンプト上に表示されない。

  • 変数に値を代入する

SET dainyuData = 代入したい値

dainyuDataの頭に%を付けると環境変数の変更になる。

  • ファイル名変更

ren text ^"%%b^".txt

変数b内にスペースが入っている場合のファイル名変換方法。コマンド構文が間違っていますと出る場合には試すとよい