バッチの基本メモ

# 書いたコマンドを実行時に非表示
基本的に一番上に書く
```
@echo off
```

# 実行後にコマンドプロンプトを閉じない
一番下に書く
```
1. 何か押すまで閉じないようにする
pause

2. 閉じないようにする
cmd /k
```

# コメントアウト
以下のどちらかの方法で説明(コメントアウトメッセージ)を記載
```
rem コメントアウトメッセージ
:: コメントアウトメッセージ
```

# echoで出来ること
```
echo 表示するメッセージ

:: メッセージを新規としてファイルに出力
echo メッセージ > ファイル名.txt

:: メッセージをファイルに追記出力
echo メッセージ >> ファイル名.txt
```

# 日時
```:日付
::**********日付**************
::一つずつ変数に格納する
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set yyyymmdd=%year%%month%%day%

::まとめた版
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
```
```:時間
::**********時間**************
::一つずつ変数に格納する
set time2=%time: =0%
set hour=%time2:~0,2%
set minute=%time2:~3,2%
set second=%time2:~6,2%
set hhmmss=%hour%%minute%%second%

::まとめた版
set time2=%time: =0%
set hhmmss=%time2:~0,2%%time2:~3,2%%time2:~6,2%
```

# copy
```:ファイルのコピー
copy [ファイル名(パス)] [コピー後ファイル名(パス)]

:: 例　拡張子一括返還
copy *.txt *.log
```
```:フォルダのコピー
xcopy /i /e [フォルダ名(パス)] [コピー後フォルダ名(パス)]

:: /i = コピー先のフォルダ名が無かったら作成する
:: /e = フォルダの中身が空でもコピーする

::バックアップ例
xcopy .\バックアップ元フォルダ .\バックアップ先フォルダ /d /e /c /y /r
```

# rename
```
rename [ファイル名] [ファイル名変更後のファイル名]
```

# 配列
```
:: 定義
変数名[0]=配列1つ目の文字列
変数名[1]=配列2つ目の文字列
・・・
```
例としてファイルを行ごとに配列に格納する場合を以下に示す
```
:: 遅延環境変数設定
setlocal enabledelayedexpansion

:: 配列個数用の変数
set list_num=0

:: ファイルを読み込んで１行毎に配列に格納する
for /f "delims=" %%a in (ファイル名.txt) do (
  set array[!list_num!]=%%a
  set /a list_num=list_num+1
)

::配列の確認
echo %array[0]%
echo %array[1]%

:: 遅延環境変数設定の終了
endlocal
```

# for文
for文内の処理で、変数の中身変更などが生じる場合は、「遅延環境変数の展開」の設定もすること
```
::1. 特定の回数繰り返す****************************************
for /l %%[アルファベット1文字] in ([開始する数],[増加させる数],[終了する数]) do (
  処理内容
)
::***例***
set cmax=20
for /l %%a in (1,1,%cmax%) do (
)

::2. すべての特定拡張子のファイルについて実行する****************
for %%[アルファベット1文字] in (*.拡張子) do (
)
::***例***
for %%a in (*.txt) do (
)

::3. すべてのフォルダについて実行する**************************
for /d %%[アルファベット1文字] in (*) do (
)
:: /d=フォルダについて繰り返すオプション
::***例***
for /d %%a in (*) do (
)

::4. ファイル中身の読み込み***********************************
for /f "delims=" %%[アルファベット1文字] in (ファイル名) do (
)
:: /f=オプションはファイルの内容に対してループ処理を行うオプション
:: ”delims=” = 区切り文字の指定をしていない。つまり、一行の中にスペースがあった場合でも、1行として認識される
::***例***
for /f "delims=" %%a in (./sample.txt) do (
    echo %%a
)
```

# if文
```
if 条件1 (
) else if 条件2 (
) else (
)

::条件例
%hoge%==1
exist 存在を確かめたいファイル名
```

# 数字の計算
```
set /a 変数1=計算式
::/a = 数式として認識する
```

# 値を入力
```
set /p 変数=表示名
:: /p = ユーザが入力できるようにする
```

# 他バッチファイルの呼び出し
```
::1. 呼び出したバッチファイルの終了を待たずに次のコマンド
start バッチファイル名

::2. 呼び出したバッチの処理が完了するまで次のコマンドには進まない
call バッチファイル名
```

# 置換
```
::1. 文字を置換****************************************************
%[置換対象文字列]:[置き換えられる文字列]=[置き換え後の文字列]%
::***例***
set string=%string:work=job%



::2. ファイル内の文字置換*******************************************
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%[アルファベット1文字] in (ファイル名1) do (
  set 1行分文字列=%%[アルファベット1文字]
  set 1行分文字列=![1行分文字列]:[置き換えられる文字列]=[置き換えた後の文字列]!
  echo !1行分文字列! >> ファイル名2
)
endlocal

::***例***
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (file.txt) do (
  set line=%%a
  set line=!line:work=job!
  set line=!line:dog=cat!
  echo !line! >> file_change.txt
)
endlocal
```

# ２つのファイルを比較
```
fc /n ファイル1 ファイル2 > 差分出力ファイル名
```

# スキップ
```
goto [飛ぶ先]
　　　　***飛ばす処理***
:[飛ぶ先]

:: ファイルの終了
:eof
```

# ファイル解凍
zipファイルやgzファイルを解凍するコマンド
```
C:\Windows\System32\tar.exe -xzf <解凍対象ファイルパス> -C <解凍先フォルダパス>

:: ※tar.exeと同じ階層に移動後に実施する場合は以下コマンドでも可能
cd C:\Windows\System32\
tar -xzf <解凍対象ファイルパス> -C <解凍先フォルダパス>

:: ***** 例 *****
:: 解凍対象ファイルパス：C:\Users\usr\デスクトップ\sample.tar.gz
:: 解凍先フォルダパス：.\（バッチファイルと同じフォルダ）
C:\Windows\System32\tar.exe -xzf C:\Users\usr\デスクトップ\sample.tar.gz -C .\
```

# PC シャットダウン
```
::PCシャットダウン
shutdown.exe /s /f /t 0

::PC再起動
shutdown.exe /r /f /t 0
```

オプションの説明
```
待機タイマー：/t 秒数（0にすることで即時実行）
警告せずに実行中のアプリケーション強制終了：/f
```

# 参考サイト
https://jj-blues.com/cms/