コマンドプロンプト バッチ 基本文法
目次
形式
コメントアウト
コンソール出力(エコー)
一時停止
バッチの実行ディレクトリ
ディレクトリ移動
変数定義、代入、計算、表示
コンソール入力を受け付ける
コマンドライン引数
ファイル出力
ファイル読み取り
管理者権限で実行したか確認する。
日時を取得
形式
バッチにする場合、拡張子は.bat
メモ帳などのエディタで編集する。日本語を使用する場合は文字コードANSIで保存する。
VisualBatというIDEを使うと開発が容易。
コメントアウト
「rem」(Remark)をつけるとコメントアウト
rem ここはコメントアウト
コンソール出力(エコー)
「echo」をつけると明示的にコンソール出力する。
デフォルトではコンソールにすべてのコマンド行が出力される(@echo on)ので、バッチを作る場合は最初に @echo off を記載しておく。
@echo on ⇔ @echo off で切り替え
>@echo off >echo テストメッセージ テストメッセージ
一時停止
>pause
続行するには何かキーを押してください . . .
バッチの実行ディレクトリ
%~dp0 で、バッチを実行したディレクトリを取得できる。
set mypath=%~dp0
ディレクトリ移動
「cd」(Change Directory)を使う。戻るときは「cd..」
C:\>cd program files C:\Program Files>cd.. C:\>
ドライブ間移動の場合は、そのまま「D:」。ただし、子フォルダに移動するのに2段階踏む必要があるので、
C:\>d:
D:\>cd myapps
D:\MyApps>
cdに/dオプションを付けると、1段で行ける
C:\>cd /d D:\myapps D:\MyApps>
変数定義、代入、計算、表示
「set」で変数定義、代入
変数を%で囲って表示する。
>set x=10 >echo %x% 10
※x=10の間にはスペースを入れないこと
"x =10"とすると、"x "(xスペース)という変数が定義される
"x= 10"とすると、" 10"(スペース10)という値が代入される
逆にいうと、デフォルトでスペースを認識してくれるということ
↓こんな書き方もできる。
>set folder path=C:\Program Files >echo %folder path% C:\Program Files
計算を行う場合、set /aを使用する
>set x=10 >set /a x=%x%+5 >echo %x% 15
コンソール入力を受け付ける
set /p を使う
例:実行確認の場合
- バッチファイル
SET /P ANSWER= "実行してもよろしいですか?(Y/N):" if /i %ANSWER%==y (goto :yes) if /i %ANSWER%==yes (goto :yes) echo 処理を中断しました。 pause EXIT :yes echo 処理を実行します。 pause
※if文に/iオプションを付けることで、大文字小文字を区別しない。
yでもYでもyesでもYESでもyeSでも通すようにしている。
- 実行結果
実行してもよろしいですか?(Y/N):y 処理を実行します。 続行するには何かキーを押してください . . .
実行してもよろしいですか?(Y/N):n 処理を中断しました。 続行するには何かキーを押してください . . .
コマンドライン引数
%1 %2 .... で引数を受け取る。
- test.bat
@echo off echo %1 echo %2
- 実行結果
>test.bat hoge fuga hoge fuga
IF文
@echo off set /p number= "数値を入力してください:" if %number%==10 ( echo 数字は10です。 ) else if %number% gtr 10 ( echo 数字は10より大きいです。 ) else ( echo 数字は10より小さいです。 ) pause
- 比較演算子
- equ 等しい (EQUal) ※==でも可能
- neq 等しくない (Not EQual) ※if not A==B でも可能
- gtr より大きい (GreaTeR than)
- geq 以上 (Greater than or EQual)
- lss より小さい (LeSS than)
- leq 以下 (Less than or EQual)
FOR文
※後で書く
While文
※後で書く
ファイル、ログ出力
「>」だと、上書きモード
「>>」だと、追記モード
>echo 上書き出力メッセージ > C:\MyApps\text.txt
>echo 追記出力メッセージ >> C:\MyApps\text.txt
どちらの場合でも、ファイル「text.txt」が存在しなければ作成する。
一方で、フォルダは作成されない。
>rem 「MyApps」フォルダが無い状態で実行 >echo 上書き出力メッセージ > C:\MyApps\text.txt 指定されたパスが見つかりません。
フォルダは事前に存在確認し、無い場合はmkdirする必要がある。
ログ出力の例(実行ディレクトリにlogfile.logを生成し書き込む)
set logfile=%~dp0logfile.log echo %date% %time% ログ出力です。 >> %logfile%
出力結果(LogFile.log)
2019/11/24 21:13:12.70 ログ出力です。
ファイルの存在確認
set logfile=%~dp0logfile.log IF EXIST %log_file% ( echo ログファイルが存在しています。 )
ファイル読み取り
※後でまとめる
rem echo test >> C:\MyApps\Batch\text.txt echo test >> text.txt rem for /f %%a in (text.txt) do ( rem echo %%a rem )
管理者権限で実行したか確認する。
一般権限だと、openfilesの戻り値がエラーになることを利用した判別↓
openfiles > NUL 2>&1 if NOT %ERRORLEVEL% EQU 0 ( echo 管理者権限がありません。管理者として実行してください。 echo 処理を終了します。 pause EXIT )
日時を取得
- 時刻
>echo %time% 22:47:29.05
- 日付
echo %date% 2019/01/01
※OSの言語や、それに紐づく実行ユーザーによって、書式が変わるので注意
日本 YYYY/MM/DD
英語 MM/DD/YYYY
年や月のみ使う場合は、文字列操作で取り出す
「 :~x,y」で、x文字目からy文字取り出す。先頭文字は0文字目としてカウント
例)%date% = 2019/11/24のとき
>set year=%date:~0,4% >echo %year% 2019 >set month=%date:~5,2% >echo %month% 11 >set day=%date:~8,2% >echo %day% 24
※日付計算時の注意事項(08と09の扱い)
コマンドラインでは、頭に0を付けた値を8進数とみなす。
8進数では、08と09は存在しないので、計算などを行うとエラーになる。
上記のmonth, dayのように取り出すと、8月、9月、8日、9日の場合に、08、09が取得できる。
そのまま文字列として使う場合は問題ないが、例えば翌日や前日を求めるために計算を行うとエラーになる。
(この問題は、08や09の入らない日付にテストしていると検出されず、後で問題になることがあるので注意。)
有名な対策として、頭に1を付与して100引く方法がある。
set /a day = 1%day% - 100
day=08だと、108-100でday=8になる。