PowerShellでのテキストモードとバイナリモード
PowerShellのコマンドの中には、直接ファイルを読み込んで処理できるものが60個程度ある。これらは、基本的にはテキストモードを使う。たとえば、文字列検索のSelect-Stringコマンドは、テキストモードでファイルを読み込んで文字列検索をする。
このコマンドに限らず、テキストモードで読み込まれたテキストファイルは、行末文字が内部コードに置き換わるので、検索などで行末文字を見つけることができないことが多い。この点には注意しないと、複数行にまたがるパターンを検索しようとしてうまくいかなくなることがある。
正規表現エンジンにも、シングルラインモード、マルチラインモードといった動作モードがある。マルチラインモードでは、行末文字を認識して複数行のテキストとして検索をする。このため、行末文字自体を検索することはできず、代わりに文頭や文末を表わすアンカーを利用する。もちろん、行末文字は読み込み時に変換されてしまうので、行末文字を表わすエスケープ文字「\n」などもヒットしない。
これに対してシングルラインモードでは、行末文字も普通の文字のように扱われ、たとえば、任意の1文字を表わす「.」に行末文字がヒットするようになる。この場合、アンカーは検索対象の先頭と末尾にしか一致しなくなる。しかし、複数行にまたがるパターンを検索できるようになる。
なお、Windowsでは、シングルラインモードのときの行末文字CRLFは、「\r\n」と指定する必要がある。シングルラインモードでは、行末文字がどうなっているのかを理解しておく必要がある。
前述のように、ファイルをテキストとして扱うかどうかは、プログラムの問題である。PowerShellのコマンドのほとんどは、ファイルをテキストモードで読み込む、このため、多くの場合は複数行にまたがる処理ができない。
バイナリモードでファイルを扱いたい場合、Get-Contentコマンドに「-Raw」オプションを付けて読み込み、これをコマンドで処理する。こうして読み込まれたファイルなら、select-stringコマンドで行末文字を含む部分を探すこともできる。たとえば、行末文字を含むパターン「1\nT」のようなパターンを検索したければ、
Get-Content -Raw <ファイルパス> | select-String '1\nT
とする。
逆に「-Raw」オプションがなければ、Get-Contentコマンドは、ファイルをテキストモードで読み込み、パイプには分解された複数のテキスト行を送り出す。この場合、後続のSelect-Stringコマンドでは、これを1行1行個別に検索処理をするため、複数行にわたるパターンを検索することができず、行末文字も見つからない。
行末文字を扱えるかどうかは、コマンド自体の問題である。ファイルを直接読み込めるPowerShellの大半のコマンドは、テキストモードで動作している。これを理解しないと、Select-Stringコマンドで直接ファイルを読み込んだとき、行末文字が見つからなくて悩むことになりかねない。バイナリモードでファイルを扱いたいならば、必ずGet-Contentコマンドで「-Raw」オプションを使う。
テキストファイルと普通に呼んでいるため、世の中には「テキストファイル」という特別なファイルが存在するかのような気がしているが、実際には、テキストファイルは約束事でしかない。テキストファイルをテキストファイルとして成り立たせているのは、これを読み込むプログラムであるということは、きちんと理解しておいたほうがいいだろう。
この連載の記事
-
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る -
第446回
PC
Windows 11のフォトアプリがUWPからWin32アプリになったことで今更わかるUWPの問題点 - この連載の一覧へ