見出し画像

フォルダを一気にまとめて作成するのは簡単なようで簡単ではなかったという話

2024年4月9日 追記:

この記事を書いた後、試しにテキストエディタの置換機能で正規表現を使ったら簡単にできてしまい、いちいちExcelを立ち上げなくても済んでしまったのでその方法を書きます。先に正規表現を使った方法を紹介し、その後に正規表現が使えるテキストエディタの紹介やインストール時の注意を書きます(メモ帳には正規表現の機能がないので下記に紹介するテキストエディタなどを使ってください)。

正規表現を使ったやり方

Windwos用のJIS配列キーボードを前提で書きます。

  1. テキストエディタで作成したいフォルダの一覧が書かれているファイルを開きます。

  2. ファイル名やフォルダ名に使えない文字(「"」「<」「>」「|」「:」「*」「?」「\」「/」など)を他の文字に置き換えておきます。全角文字に置き換えても大丈夫ですが、特にこだわりがないのなら「_(アンダースコア)」に置き換えるのが無難だと思います。また「♡」のような機種依存文字は「__ハート__」といった具合にコピー元のファイル名と一緒に変更しておきます(でないと以下のバッチファイル(拡張子が「.bat」となっているもの)を実行したときにエラーとなります。フォルダ名はあとからPowerRename(Microsoft PowerToys: Windows をカスタマイズするためのユーティリティ:https://learn.microsoft.com/ja-jp/windows/powertoys/)などを使って「__ハート__」から「♡」に変換すれば大丈夫です)。ただしサブフォルダまで作成する場合は「フォルダ名\サブフォルダ名」とする必要があるため、サブフォルダまで作りたい場合は取り除かないでください。

  3. テキストエディタの置換機能を呼び出し、正規表現が使えるようにします(だいたいは「正規表現」というところにチェックを入れるだけでOKです)。

  4. 「置換前」や「検索する文字列」の欄には「^(ハット。BackSpaceキーの2つ左のキーがそれです)」を入力します。

  5. 「置換後」や「置換後の文字列」の欄には「md "」と入力します。

  6. 置換を実行します。うまく行かない場合はCtrl-Aでテキスト全体を指定した状態で実行してください。実行すると各行の先頭に「md "」というのが追加されているはずです。

  7. 次に「置換前」や「検索する文字列」の欄には「$(ドル記号。「半角/全角」キーの4つ右の「4」の上にある文字。)」を入力します。

  8. 「置換後」や「置換後の文字列」の欄には「"(ダブルクオート。「半角/全角」キーの2つ右の「2」の上にある文字。)」と入力します。

  9. これで同じようにテキスト全体に対して置換を実行します。

  10. 各行が「md "作成したいフォルダ名"」となっていればOKです。

あとはこのテキストファイルをShiftJIS形式でフォルダを作成したいフォルダに「foo.bat」といった具合に拡張子が「.bat」のファイルを保存し、エクスプローラーからこの「foo.bat」をダブルクリックすればフォルダが作成されます(コマンドプロンプトやPowerShellを開いてフォルダを作成したい場所に移動し、テキストエディタに表示されているフォルダ一覧を全選択してコピペしてもOKです)。

これって何をしたの?

正規表現で「^」は行の先頭を指し、「$」は行の最後を指します。ですので行の先頭に「md "」を追加し、行の最後に「"」を追加しただけです(正確には置換でが)。「md」または「mkdir」はディレクトリ(フォルダ)を作成するコマンドなので「md "あああああ"」は「『あああああ』というディレクトリ(フォルダ)を作成しろ」という命令になります。他の使い方としては、検索で「こんにちは」で始まっている行を探したい場合は「^こんにちは」とすれば「こんにちは」で始まっている行を見つけることがで、文中に「こんにちは」があってもそれは検索に引っかかりません。

正規表現はプログラムによって微妙に書き方が違ったりしますが、この「^」と「$」はどのプログラムでも同じなので、サクラエディタでは大丈夫だったのにEmEditorではダメだったというこはない(はず)です。

正規表現について知りたければ「正規表現」でぐぐるなり以下のような正規表現の本がありますので、そちらを読んでください。

正規表現を扱えるテキストエディタの入手先

正規表現を扱えるテキストエディタとしてサクラエディタとEmEditorを紹介します。Windowsについてくるメモ帳には正規表現の機能がありませんのでこれらのエディタをダウンロードしてインストールしてください。

サクラエディタ(https://sakura-editor.github.io/)
EmEditor(https://jp.emeditor.com/)

サクラエディタは無料で使えるテキストエディタなのですが、インストールするまでがちょっと面倒で、サクラエディタの圧縮ファイルの中のwarning.txtに以下のようなことが書かれています。

Windows 標準の機能で解凍した場合、実行ファイルまたはインストーラの起動時にSmartScreen という機能により警告が表示されます。

サクラエディタの「warning.txt」から引用

なので、ExpLzhや7-Zipといった圧縮・解凍ソフトを使ってインストーラーを取り出す必要があります。それぞれ以下の場所で公開されています。

ExpLzh(https://www.ponsoftware.com/)
7-Zip(https://7-zip.opensource.jp/)

これらの圧縮・解凍ソフトをインストールしたら、サクラエディタは「sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip(2024年4月9日時点)」をダウンロードした後、ExpLzhや7-Zipで解凍し、「sakura_install2-4-2-6048-x86.exe」を実行してインストールすればOKです。

EmEditorはサブスクリプションのテキストエディタなのですが、機能制限されているフリー版は無料で使えるので、フリー版を使えばいいと思います(私は永久ライセンス版を購入しましたが)。以下にプロフェッショナル版(有料版)とフリー版の違いが比較表として載っていますので参照されるとよいと思います。

で、いまアクセスしたら「(2024年 8月 28日に永久ライセンスの販売を終了」とあったので、永久ライセンス版の購入を考えている方は行動に移された方がいいと思います。

メモ帳も昔と比べて複数のファイルをタブで開いたり文字コードをUTF-8などで保存できたりと昔より使い勝手は良くなりましたが、それでもプログラマや物書き屋などはサクラエディタやEmEditorといった高機能でより使い勝手のよいテキストエディタを使いますので、自分にとって使い勝手の良いテキストエディタを見つけてインストールして使った方がいいと思いますので、メモ帳を使い続けているかたはこれをきっかけにテキストエディタの乗り換えをしてみるのもいいのではないかと思います。

これで解決できる人は以下の記事を読む必要はないと思います。しかし会社などでインストールしてよいプログラムが制限されている場合、これらのテキストエディタが使えない場合もありますので、その場合はExcel(とメモ帳)を使ってください(メモ帳でバッチファイルを保存するときはANSIですのでご注意を)。

以上、追記終わり。
==========

作成したフォルダの名前のリストは持っているけど、1つ1つフォルダを作成するのは面倒くさいので一気にまとめて作成する方法を探していたところ、Excelを使った方法が結構紹介されているのですが、実際やってみると上手くいきません。

理由は2つあり、1つは漢字コードの問題。もう1つはフォルダ名に空白が含まれているときの問題になります。

バッチファイルにして実行するなら漢字コードをShiftJISにしなければならない

現在漢字コードはUTF-8が一般的な感じですが、WindosのコマンドプロンプトとPowerShellでUTF-8のファイルとShiftJISのファイルを表示させると以下のようになります。

コマンドプロンプトでUTF-8とShiftJISのファイルを表示させた結果
PowerShellでUTF-8とShiftJISのファイルを表示させた結果

コマンドプロンプトだとShiftJISでないと漢字がちゃんと表示されませんが、これがPowerShellになるとUTF-8でないと漢字がちゃんと表示されません。

エクスプローラーからバッチファイルをダブルクリックで実行させる場合コマンドプロンプトの方で実行されるようで、バッチファイルはShiftJISで保存しないと文字化けしたフォルダが作成されます。

実際に以下のように「あいうえお」と「かきくけこ」というフォルダを作成するバッチファイルを作成し、それをUTF-8で保存して実行した場合とShiftJISで保存して実行した場合は以下のようになります。

UTF-8で保存したバッチファイルをエクスプローラーから実行した結果
ShiftJISで保存したバッチファイルをエクスプローラーから実行した結果

試しにコマンドプロンプトとPowerShellのそれぞれでUTF-8とShiftJISのバッチファイルを実行したところ以下のようになりました。

コマンドプロンプトでUTF-8で保存したバッチファイルとShiftJISで保存したバッチファイルを実行した結果
PowerShellでUTF-8で保存したバッチファイルとShiftJISで保存したバッチファイルを実行した結果

コマンドプロンプトはShiftJISのファイルでないとファイルの中身を表示をさせたときに文字化けするのでこうなるのは納得なのですが、PowerShellはファイルを表示させるときはUTF-8なのに、バッチファイルとして実行させるときはShiftJISでないといけないという、なんとも不可思議なことがおきました。

設定画面を見ると「既定のプロファイル」としてコマンドプロンプトが設定されていたので、これをPowerShellにして再度試して見ましたが、UTF-8だと文字化けしたフォルダが作成され同じ結果になりました。

PowerShellはファイルを表示させるときはUTF-8なのに、バッチとして実行するときはShiftJISという、ある意味ダブスタ糞オヤジ的でちゃんと統一させろよと言った感じです。

もしかしたらWindows 95がMS-DOSの上で動いたウィンドウソフトだったのと同じで、PowerShellはコマンドプロンプトの上で動いているコンソールソフトなのかもしれませんが、中身について知るすべもないし、とりあえずShiftJISでバッチファイルを作っておけばどっちでも動くので、これ以上労力をかけるべきではないかもしれません。

ExcelでCSV形式で保存するときは「CSV(コンマ区切り)(.csv)」であって「CSV UTF-8(コンマ区切り)(.csv)」ではないので要注意。サクラエディタやEmEditorなどでこちょこちょっといじったときは「ShiftJIS」で保存すればよく、メモ帳を使っている場合は「ANSI」で保存すればOKです。

フォルダ名に空白が含まれている場合はダブルクオート(")で囲ってやらないといけない

昔は「ファイル名やフォルダ名に漢字なんか使うんじゃねーよ!」「ファイル名やフォルダ名に空白をいれてんじゃねーよ!」というのが普通で、これらの行為をした人は市中引き回しのうえ火炙りの刑に処せられたモノですが、それがマイクロソフト自身がフォルダ名に「C:\Program Files」なんて空白を使っててしまって信者が教祖に裏切られたような気分になりましたが、コロコロと教義を変えられても完全に依存してしまっているので、従い続けなければいけない運命にあると思って諦めるしかありません。

それはさておき、ファイル名やフォルダ名に空白が含まれている場合はそれらをダブルクオート(")で囲ってやらなければいけません。上記の例でいうと "C:\Program Files" という具合です。サブフォルダまで含めた場合は "C:\Program Files\foo" といった具合にする必要があります(noteだと円サインがバックスラッシュに置き換えられてしまいましたが、実際はBack Spaceキーの1つ左のキーに描かれている円サインであって、右下のShiftキーの1つ左のキーに描かれている「\」ではないので、知らない方はご注意を)。

これをしないとコマンドプロンプトは空白で複数のファイル名やフォルダ名が区切られていると判断し、空白で区切られた数だけファイルやフォルダが指定されたものとしてプログラムにこれらが引き渡されてしまいます(プログラムが引数をどのように扱うか次第ですが、おそらくエラーになるか無視されます)。

なので「空白で区切られてるんじゃなくて、1つのファイル名やフォルダ名なんだよ」と分からせるためにダブルクオート(")で囲っているわけです。

ぐぐったときにExcelを使った方法を紹介しているところで空白の扱いまでちゃんとやっているところは以下のWebページでした(こちらではバッチファイルを作成するのではなくコマンドプロンプトにコピペしてフォルダを作成する方法をとっています。この方法だとコマンドプロンプトでもPowerShellでも漢字コードを心配する必要はありませんが、事前にcdコマンドでフォルダを作成したい場所に移動しておかないと変なところにフォルダを作成することになるので、そこは注意です)。

ExcelのCHAR関数を使ってフォルダ名の前後にダブルクオートをつけています(34がダブルクオートのコード番号になります)。詳しくは上記Webページの「例3:空白を含むフォルダーを作成する」というところを読んで、バッチファイルを作るなりコマンドプロンプトにコピペするなりすればいいと思います。

まとめ

  • Excelだろうとなんだろうと、とにかくバッチファイルを作りそれを実行してフォルダを作成するなら漢字コードは必ずShiftJISにすること。ただしコマンドプロンプトやPowerShellにコピペして作成する場合は特に気にする必要はない。

  • フォルダ名に空白が入っている場合は必ずダブルクオートで囲うこと。1つ1つ判断するのが面倒なら全部ダブルクオートで囲ってしまうこと(空白のないフォルダ名をダブルクオートで囲っても問題ありません)。

テキストエディタで正規表現が扱えるならそれでフォルダ名の前にフォルダ作成のコマンド(mdまたはmkdir)とダブルクオートをつけて、その後にフォルダ名の最後にダブルクオートをつけるという方法でもいけそうな気はしますが(矩形貼り付けでもいけるのかな?)、なんとなくExcelを使った方が分かりやすいし簡単かなと思います。そこは慣れなり好き嫌いといったことで自分にあった方法を選べばいいと思います。

次回は「ファイルのコピーソフト、どれが一番速いの?」をお送りします(たぶん。今のところ自分の中ではFastCopyが最強伝説ですが、NASなどにコピーさせるとLANの通信速度の限界くらいで行うので、他のLANを使ったソフトがLANを使おうとしてもなかなか使えずもっさりとした感じになるので、その場合はFastCopyの設定で「ちょっと控えろ」とすればある程度は解決しますが、今度はFastCopyがコピーに時間がかかることになるので、それはそれで悩ましいです。LANを10Gbpsで構築すればいいのかもしれませんが、スイッチングハブが8ポートで10万円以上するのを見て諦めました)。


いいなと思ったら応援しよう!