0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

windowsのコマンドについて少し勉強する記事

Posted at

こんにちは。
最後に投稿した日から7年経っててガクガクしているyuwaitaです。

ある日、ファイル名変更のためのwindowsのコマンドについて、teratailで質問してみたんですよ。

すると直ぐに素晴らしい回答を頂いて感謝しかなかったです。

しかし全く理解できないコードだったので、勉強のため再びQiitaを開きました。回答頂いたコードは以下。

for /l %%I in (1,1,100) do call :RENAME %%I
exit /b

:RENAME
set /a J=1000+%1
ren *(%1).html %J:~1,3%.html
exit /b

これを読み解いていくためのページです。
※間違っていることが書いてあったらご指摘いただけるとありがたいです。

読み解く

for /l %%I in (<開始値>, <増分>, <終了値>) do <実行コマンド>

値をループする構文です。
%%Iというやつは変数。

call <実行するバッチ>

バッチやラベルを呼び出す構文です。

:RENAME

コロン(:)を一番前につけるとラベルになるらしい。
2つともを:RENAMESURUYOとかにしても問題なく動きます(あたりまえ)。
2つめの:RENAMEのあとに書かれたことを20回ループするのですね。ふむふむ。
しかしなぜ:RENAME %%Iと、あとに変数がつくのかよくわかりません。とりあえず次へ。

exit /b

処理を終了させるコマンドです。/bが無いと全終了しちゃう。詳しくは参考URLを。
無くても動くけど入れとくと親切的なもの。

set [オプション] [環境変数名=[値]]

環境変数を設定する構文です。
/aはオプションで、値を数式として評価するためのもの。ふむふむ。
Jは環境変数名。
1000+%1 これなに。わかんない。とりあえず次へ。

ren <変更前ファイル名> <変更後ファイル名>

ファイル名やディレクトリ名を変更する構文です。つまり
*(%1).html
から
%J:~1,3%.html
へ変更する。なるほど・・・?

このバッチは何をやっているのか

ここで、このバッチが実際に何をやっているのか、画面上で内容を見てみたいと思って調べると
cmd /kが、指定したコマンドを実行した後に、起動したコマンドプロンプトを終了しないでいる構文でした。
exit /bを消して、for の次の行にcmd /kを設置して動かしてやると。。こんな表示が。

C:>for /L %I in (1 1 100) do call :RENAME %I

C:\>call :RENAME 1
C:\>set /a J=1000+1
C:\>ren *(1).html 001.html

C:\>call :RENAME 2
C:\>set /a J=1000+2
C:\>ren *(2).html 002.html

以下100まで続く

これで、だいたい仕組みがわかってきました。

もっと詳しく調べる

前にパーセント(%)を前に付けると、環境変数を呼び出すことができるとのこと。
%Jというのはつまり、setで定義したJの変数を呼び出しているのですね。ふむふむ。

%1というのは、引数で、コマンドに引き渡すことができる。。。?

。。。🤔

あっ!そうか。おそらく、:RENAME %%I%%Iが引き渡す元となるものかな。
つまり、%%I が 1 のときは、%1 は 1、%%I が 50 のときは %1 は 50
になるってことですね。ふむふむ。

%J:~1,3%.htmlは、J に入っているのが 1001 だとするとこれを 001 にするためのものですね。
%J% で J に入っているものを取り出せるので、:~1,3 というのは、1桁から3桁までを取り出す・・といった指定なのでしょう(予想)。

もう一ついただいた回答について

上のほかに、もう一つ別の回答例をいただいていました。
ここまで調べた上で改めて見てみると、何を書いてるか全くわからなかったのに、今ではだいぶわかってきていて面白いです。

for %%F in (*^(*^).html) do call :RENAME %%F
exit /b

:RENAME
set A=%1
set B=%A:*(=%
set C=%B:).html=%
set /a D=1000+C
ren %1 %D:~1,3%.html
exit /b

こちらの例では、1から100までのループではなく
ファイル名そのものをループしていく内容になっているようです。
ファイル名を分解していき、C に数字のみを取り出している様子がうかがえます🤔

というわけで、コマンドについて知見を深められました。
今までバッチ処理について検索しても、まったく情報を得ることができず苦労していましたが、
この記事を書くために調べる過程で「どのようなワードで検索すれば良いか」がわかってきて、
次回からはやりたいことを自分で調べて書けそうな自信がつきました(自信だけ)。

ファイル名変更については、今まではソフトでなんとかしてたのですが、
バッチ処理がわかってくるとちょっと楽になるので、どんどん使っていきたい所存です。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?