Windowsコマンドのメモ

# ファイル名の一部を切り抜いて、その後に連番をつける方法
 フォルダ内の全てのファイルに
 ファイル名の〇文字目から〇文字分＋連番というファイル名にしたい
 と思った時のコード。
 
 仕事やプライベートで役立つかもしれない。
 コードの解説は後ほど記載する。

```
setlocal

set num=0
setlocal enabledelayedexpansion

for %%f in (*.csv) do (
rem 9個目のファイルまでに適用
if 9 geq !num! (
rem ファイル名を取得(拡張子なし)
	set fairu=%%~nf
rem 後ろから100文字目から100文字分を切り抜き
	set fairu=!fairu:~-100,100!
rem 0+数字の2桁数字にする
	set num=0!num!
	ren "%%f" !fairu!_!num!.csv
rem 01～09から1桁だけ外して0にする
	set num=!num:~1!
) 
set /a num=num+1
)
endlocal
exit
```

### 解説
```
set num=0
```
後の処理のために、まず変数numを0にしておく必要がある。

 ```
 setlocal enabledelayedexpansion
```
 ループ処理の中で使われる変数を使うためには setlocal enabledelayedexpansionが必要

 :::note warn
ループ処理を抜けた後のコードで、別のループ処理を行う時には
setlocal enabledelayedexpansionとendlocalで囲んでください。
:::

```
for %%f in (*.csv) do (
```
このbatファイルを置いてある場所にある全てのCSVファイルにループ処理
 この時、.csvをC:\test\*.csvにすることで場所を指定することも可能
```
if 9 geq !num! (
```
9個目のファイルまでに適用
```
set fairu=%%~nf
```
取得したファイル名から拡張子を除いたものをfairuという変数に入れる。
%%~nfで%%fから拡張子を外したものを取得という意味になる。
```
set fairu=!fairu:~-100,100!
```
先ほど取得したファイル名の後ろから100文字目を起点に100文字分抜き出す。
変数fairuを「ABCDFG」、-5,3にすると結果は「BCD」になる。

:::note warn
Forの中で使う変数は通常の即時展開での % で囲むのでは無く、遅延展開での ! で囲み処理します。
:::
```
set num=0!num!
```
ファイル数が9個以内の時にnum変数が001～009になります。
```
ren "%%f" !fairu!_!num!.csv
```
リネームします。

:::note warn
リネームの時もForの中で使う変数は通常の即時展開での % で囲むのでは無く、遅延展開での ! で囲み処理します。
:::
```
set num=!num:~1!
```
num変数を0に戻します。
1回目のループの時にはnum=001で!num:~1!でnum変数の2つ目の1文字を取っています。
```
set /a num=num+1
```
ループ処理のために変数numの値を+1してます。

 :::note info
10個目以降のファイルに反映する場合は以下のコードを追加してください。
:::
```
set num=0
setlocal enabledelayedexpansion

for %%f in (*.csv) do (
rem 9個目のファイルまでに適用
if 9 geq !num! (
rem ファイル名を取得(拡張子なし)
	set fairu=%%~nf
rem 後ろから100文字目から100文字分を切り抜き
	set fairu=!fairu:~-100,100!
rem 0+数字の2桁数字にする
	set num=0!num!
	ren "%%f" !fairu!_!num!.csv
rem 01～09から1桁だけ外して0にする
	set num=!num:~1!
) else (
	if 99 geq !num! (
rem ファイル名を取得(拡張子なし)
	set fairu=%%~nf
rem 後ろから100文字目から100文字分を切り抜き
	set fairu=!fairu:~-100,100!
	set num=!num!
	ren "%%f" !fairu!_!num!.csv
rem 10～99から0桁だけ外して0にする
	set num=!num:~0!
	) else (
rem ファイル名を取得(拡張子なし)
	set fairu=%%~nf
rem 後ろから100文字目から100文字分を切り抜き
	set fairu=!fairu:~-100,100!
			ren "%%f" !fairu!_!num!.csv
	)
)
set /a num=num+1
)
endlocal
exit
```
### 追加された部分の解説
```
if 99 geq !num! (
```
10個目～99個目のファイルまでに反映
```
set num=!num!
```
変数numに10~99の数字を入れます。
```
set num=!num:~0!
```
num変数は010~099なので最初の1桁を外します。


# ファイル名を日付＋連番にしたい時
現在日時＋連番の簡単な形にした時は以下のコードを使います。
 ```
 set YYYYMMDD=%DATE:/=%
```
日時はDATEで取得できますが、YYYY/MM/DDなので :/=% で / を除外します。

:::note warn
これはForの中の変数ではないので通常の即時展開での % で囲みます。
:::

```
ren "%%f" %YYYYMMDD%_!num!
```
これでリネームします。

:::note warn
%%fはForの変数なので!で囲みます。(numも同様)
変数YYYYMMDDはForの外で宣言した変数なので%で囲みます。
:::

# ファイル名を連番＋拡張子にしたい時

```
set num=0
setlocal enabledelayedexpansion

rem 名前なしPNGを日付＋連番へ
for %%f in (C:\Works\test\*.*) do (
if 9 geq !num! (
	set str=%%~xf
	set str=!str:~1,5!
rem 0+数字の2桁数字にする
	set num=0!num!
	ren "%%f" !num!.!str!
rem 01～09から1桁だけ外して0にする
	set num=!num:~1!
	set str=!str:~1,5!
) else (
	if 99 geq !num! (
	set str=%%~xf
	set str=!str:~1,5!
	set num=!num!
	ren "%%f" !num!.!str!
rem 11～99から0桁だけ外して0にする
	set num=!num:~0!
	) else (
			set str=%%~xf
			set str=!str:~1,5!
			ren "%%f" !num!.!str!
	)
)
set /a num=num+1
)
endlocal

exit 
```
### 解説
```
for %%f in (C:\Works\test\*.*) do (
```
C:\Works\test\の全ファイルを対象とする。
```
set str=%%~xf
```
拡張子を取得。
「.」も含むため、取得出来る文字列は「.拡張子」
    (例)「.png」
```
set str=!str:~1,5!
```
「.拡張子」の1文字目の次から5文字分
これで拡張子だけを取得できる。
     (例)Webp、png、jpg
     
:::note info
「.」を外していないとリネーム時に「ファイル名..拡張子」となり
「.」が2つ並んでる状態になるため、ここで外す。
:::


:::note warn
~1,5で2文字目から5文字分なので間違えないようにする。
:::

```
%%f" !num!.!str!
```
ファイル名を連番＋「.」＋拡張子にする。

# その他
基本的なコマンドを記載する。
```
MOVE 移動元ファイル名 移動先フォルダ
COPY 移動元ファイル名 移動先フォルダ
REN リネーム前のファイル名 リネーム後のファイル名
```

:::note info
REN⇒リネーム前のファイル名はフルパスでも良いが
リネーム後はファイル名のみにする。
:::