てみブログ

てみブログ

個人的な覚書用です

コマンドプロンプト バッチ 基本文法

目次

形式
コメントアウト
コンソール出力(エコー)
一時停止
バッチの実行ディレクトリ
ディレクトリ移動
変数定義、代入、計算、表示
コンソール入力を受け付ける
コマンドライン引数
ファイル出力
ファイル読み取り
管理者権限で実行したか確認する。
日時を取得

形式

バッチにする場合、拡張子は.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になる。