bat 備忘録

## echo off
コマンドエコーバックを停止する。
→実行するコマンドの逐一表示を停止。
```bat
@echo off
echo エコーバック停止
```
## コメント
```bat
REM コメント
```

## 変数
setで定義、%変数%で使用。
```bat
set x=TEST
echo %x%
```
## 環境変数と遅延環境変数
if() や for() のカッコ内ではデフォルトで環境変数が適用されるため注意が必要
遅延環境変数を使用する場合、<b>setlocal enabledelayedexpansion</b> から <b>endlocal</b> の間に記述し、
変数は<b>「!変数!」</b>で使用する。
```sample.bat
@echo off
set x=TEST
if "%x%" == "TEST" (
   set x=SAMPLE 
   echo x1%x% 
) 
echo x2%x% 

setlocal enabledelayedexpansion
set y=TEST

if "%y%" == "TEST" (
   set y=SAMPLE
   echo y1!y!
) 
echo y2%y%
endlocal
pause

```
```
x1TEST
x2SAMPLE
y1SAMPLE
y2SAMPLE
```

### うまくいかないとき
・<b>「!変数!」</b>となっているか。
→遅延環境変数を使うときは「%変数%」ではなく<b>「!変数!」</b>

・「変数 = 値」のようにスペースが入りこんでいないか
→「変数=値」のように詰めて記述すること

## /p 入力情報取得
```bat
@echo off
set /p answer=【/pテスト】_文字を入力してください。  

echo 入力した文字は %answer% です。
pause
```


## if
```bat
@echo off
set /p answer=本を英語で何と言いますか？ 
set judge=未判定

if %answer%==BOOK (
  set judge=正解
  echo Q1.変数の中身は？→ %judge%

) else if %answer%==book (
  set judge=正解
  echo Q1.変数の中身は？→ %judge%

) else (
  set judge=不正解
  echo Q1.変数の中身は？→ %judge%
)

  echo Q2.変数の中身は？→ %judge%
pause
```

比較演算子|判定
|----|----|
[文字列1] == [文字列2]|==
[数値1] equ [数値2]|==
[数値1] neq [数値2]|not ==
[数値1] lss [数値2]|<
[数値1] leq [数値2]|=<
[数値1] gtr [数値2]|>
[数値1] geq [数値2]|=>

#### 変数の中身は？
if文で変数に値を代入した際、代入の結果はif分を抜けてから反映される
→上記例文ではQ1:未判定、Q2に正解もしくは不正解

→ 環境変数と遅延環境変数

### うまくいかないとき
```bat
REM 閉じカッコ「)」がif句の一番下にいないとプログラムが強制終了する
if %answer%==強制終了しない ( echo 強制終了しない
)

if %answer%==強制終了する ( echo 強制終了する)
```
```bat
) else if %answer%==失敗例 (
  REM　【注意】空白のブロックがあるとプログラムが強制終了する
```
```bat
)else if %answer%==失敗例(
  echo【注意】 REM 「(」の前と「)」の後には必ず半角スペースを記述
```

### パラメータの有無を確認する際は""で囲う
「『""』がないと 『if =="" (』となり強制終了する。」
```bat
if "%~1"=="" (
	echo パラメータがありません。
	pause
	exit
)
```

## for

### 同ディレクトリのファイル名一覧取得
```
for %%アルファベット1字 in (ディレクトリ) do (
処理
)
```
```bat
@echo off
for %%f in (*.bat) do (
echo ファイル名：%%f
)
pause
```
### うまくいかないとき
・「in」が抜けていないか

### 変数加工

https://rainbow-engine.com/batch-get-filepath-filename/

## ループカウンタ
```bat
@echo off
rem ループカウンターを使うには事前に宣言が必要
setlocal enabledelayedexpansion
rem ループカウンターの初期化
set /a counter=0
for %%i in (a,b,c) do (
    set /a counter=counter+1
    echo !counter! : %%i
)
pause
```

## 再帰的に実行
for文に/rオプションを付けると再帰的に実行される。
例は入力した値で .py ⇔.py.txt を入れ替えるbat 
 
```bat
@echo off
set /p answer="Prease select convert type you need: .py.txt:[1] .py:[0] >>>>>"
if %answer% EQU 1 (
	set before=*.py
	set after=.py.txt
) else if %answer% EQU 0 (
	set before=*.py.txt
	set after=
) else (
	exit
)
for /r %%i in (%before%) do (
	ren "%%i" "%%~ni%after%"
)
```





## 改行
「^」で改行

```bat
@echo off

echo 改^
行^
テ^
ス^
ト

実行結果 > 改行テスト
```

## 中断
```bat
@echo off

echo 中断テスト
pause
```
## パラメータ
コマンドで渡す方法とbatファイルにドラッグ アンド ドロップして渡す方法がある。
```bat
@echo off
 
echo 第1引数は「%1」です。
echo 第2引数は「%2」です。
echo 第3引数は「%3」です。
```



## パラメータの加工
第1引数「%1」の例
コマンド|主な動作|表示例|
|----|----|----|
%1|そのまま表示|C:\Users\user\Desktop\TEST.txt|
%~1|ダブルクォーテーション「”」を除いて表示|C:\Users\user\Desktop\TEST.txt|
%~d1|ドライブ名のみ表示|C:|
%~p1|パス名のみ表示|\Users\user\Desktop\
%~n1|ファイル名のみ表示|TEST|
%~x1|拡張子のみ表示|.txt|
%~nx1|ファイル名.拡張子表示|TEST.txt|
%~a1|ファイルの属性を表示|--a--------|
%~t1|ファイルの更新日時を表示|2022/08/0503:11|
%~z1|ファイルのサイズを表示|604|



## 関数
・関数を呼び出し元より上に書くと「exit /b」でプログラムが終了になるので注意
・関数を呼び出し元より上に書いて「exit /b」を消すと無限ループになるので注意
```
@echo off

call :testSub
echo TEST2
exit /b

:testSub
echo TEST1
exit /b
```
### パラメータの受け渡し
call 関数名 p1 
%1で受け取る
```
@echo off
for %%f in (*.txt) do (
	call :testSub %%f
)
pause

:testSub
if "%1" neq "" (
	echo %1
)
```

## 参考記事

https://qiita.com/sta/items/8cab80fe74b8dcfa5336

https://qiita.com/plcherrim/items/8edf3d3d33a0ae86cb5c

https://jj-blues.com/cms/wantto-cutstringpathname/