ボロボロ皇帝のボロ切れと塊

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。たまにExcel、家電、音楽等についても好きに吐いてる。

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。
Excel、家電、音楽、ゲームイラスト小説映画、性癖について等、何でも好きに吐いてる。

どうでも良いかもしれんが背景色変わっていくの見てくれ。
更にどうでも良いかもしれんがアイコンが息してるの見てくれ。


我輩は何にも制約されない身、
「耐えぬ」事を恐れないと決めたのだ!
我輩は好きなときに悪態をつく!
妬み僻み嫉みを背負い、
マイナーだろうが邪道だろうが
我輩は我輩の道を行く!
好きなものは懸命で不器用な諸君,
嫌いなものは器用で完璧を気取った奴らだ。
         

【(winOSコマンド)for文】拡張子を一括変換するバッチ~さよなら拡張子変換君~【雑な解釈での解説付き】

 ⚠注意⚠for文って色々あるが今回はwindowsコマンドプロンプト上で動くコマンドのfor文である。

 

パート社員(中高年女性)S氏に、最近、資料スキャン&ファイル名変更を頼んだら、スキャン後の全pdfファイルから拡張子が綺麗さっぱり消えていた。※しかも一部はファイル名すらも間違っていた。

拡張子という概念が無いのは致し方ない。拡張子表示設定にしていた我輩が悪いとも言える。だが、元から全ファイルに付いてるもんを消さなくとも…まあ、そんなことなどいちいち見ないタイプのS氏であるから、やはりしゃあない

 

というわけで、久々に、以前作ってあった拡張子一括変換バッチを使った。ついでに、ここにも載せておくかと思った次第である。

 

色んな解説付けてしまったため、すっ飛ばしたい諸君のための目次↓

 

 一応念のためにバッチについて我輩なりに説明しておく(ここに辿り着く諸君のほとんどが不要だろうが、初めての諸君のためにも)。

バッチとは:

面倒なことを自動で処理してくれるすごいやつ。今回ここでは、WindowsOSのコマンドプロンプト上で動かすやつである、batファイルについて言っている。

batファイルの作り方は非常に簡単。ただ、メモ帳等で作成可能なテキストファイルの拡張子(txt)を、batにすればいいだけ。んでもってダブルクリックしたり、処理したいファイルをそいつにドラッグドロップしたり、トリガー(条件)のタイミングで実行される。

 

 

ではではさっそく解説していく(調べてもすぐ忘れる己のための備忘録を兼ねているので、適当な解釈をしているところも多々有り)

 

拡張子を変えたいが大量すぎてキツいときのためにぜひどうぞである。


まずはfor文の仕組みをぼんやり理解しよう。


for %%f in (%*) do (
echo %%f
)

このコードが書かれたbatファイルに、たとえば、C:\Users\Downloads\ddd.txtパスのddd.txtをドラッグドロップした場合。
コマンドプロンプト上には、実行コードと併せて、C:\Users\Downloads\ddd.txtが吐き出される(pauseで止めればわかる)。

これはechoの処理によるものである。
※echoとは:実況みたいなもん。

1行目にecho offを入れると、2行目以降は純粋に実行結果(ドラッグドロップしたファイルのパスC:\Users\Downloads\ddd.txt)だけコマンドプロンプト上に表示される(実況はoffなため)。もしecho %%fのechoをなくした場合、ただドラッグドロップしたファイルが開かれる。

 

つまり、

for %%f in (%*) do ()

これはすなわち、

%fという変数に、ドラッグドロップしたファイルパスを代入し(in部分)、そのファイルに対しあらかじめ決めておいた処理を繰り返す(do ()部分)

というコードである。

※変数は%%の次に適当にアルファベット1文字か数字1つ付ければ良いだけ。%%aでも%%5でもなんでもいい。動くから。じゃあアルファベット数字2つ以上つけたらどうなるの?ってな話だが、単純に動かん。何が起こってるかも分からん。エラーが出るわけでもなく無反応。実行状況が可視化されないのだ。pauseで止めてコマンドプロンプト上で見るのももちろん無理だしコマンドプロンプトを先に開いておいてもなんも変化無し。ナニが起きているんだろうか…。

%*はファイルパスを代入するための特別なやつ(引数とかいう)。万が一拡張子変換コードで、コレ%**だけにするとドラッグドロップ関係無く、その実行するbatファイルが置かれているフォルダ内の全ファイルが勝手に拡張子変換されるし(*がワイルドカードなので当然だが)、%だけにすると動かない。

コマンドプロンプト上で%が1つ減って%fとなるのは仕様コマンドプロンプト上では%1つで良いが、バッチ処理する場合は実行時1つ消えるので%を1つ多く書いてあげないといけない。そういうもん。何でかは知らん。実行方法が異なるとこういうこともあるよな。エスケープ的役割かと適当に思っている。とりあえずbatという魔法で%1つ消費するんだな、程度に思っておけばいい。

 

 

でまあ、今回は

「名前を変更する」という処理

をしてほしいわけだから、

renというRenameの略なコマンドを指定。

そして、拡張子だけを変更したいので、拡張子前は変更しないようにワイルドカードを使い、拡張子はpdfに指定して、

 

for %%f in (%*) do (
ren %%f *.pdf
)

こんな感じにする。

※もちろんtxtにしたいなら*.txt、jpgにしたいなら*.jpgと変換したい拡張子に合わせて変更を。 

 

一応、

for %%f in (%*) do (ren %%f *.pdf)

と言った感じで、1行でも良い

 

複数行に分けるのが通例になっているのは

この繰り返し処理をするfor文習得後、更に色々と覚えていけば処理も増えdo ()の中身である処理コードの文が長くなることも通常だから、だろう(多分)。それなら分ける書き方に慣れておいた方が良いのかもしれん。長いのに1行で書いてあるものは確かに見づらくてクソだしな。

だが今回の拡張子変更は短文だし、分けている理由が不明なままで何となくやってると、逆に意味が分からなくてアレだろうから、こういう1処理の短文に関しては1行でもいいっぽいぜということを伝えておく。

 ※あと、for %%f in (%*) do ren %%f *.pdfといった感じで括弧で囲わなくてもいい(%*は囲うこと)。これは処理コードが1つだからと思われる。

複数になると、こっからここまでのコードをfor文で繰り返し処理しますよ~(^o^)みたいな意味で囲う必要があるんだろうか、と確認すると、そもそも複数処理だと要括弧に加えて複数行に分ける必要があった。どういう理屈なんだ、クッソ意味分からん。

 

では、以上。

 

我輩はやりたいことだけ出来ればいい派だが、一応適当に意味は理解しておきたいという欲もあるので、ド素人疑問をまんま試した結果がここまでの解説である。そういうわけだから、正しいんだか正しくないんだかみたいな部分もあるだろう。

こんな感じの適当極まりない解説が必要かは知らんが、1割ぐらいはためになったのではなかろうか。どうだ?嘘でもいいから「なった」と言っておくがよい。