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
とする。
Get-Content -Rawオプションを使うと、バイナリモードでファイルが読み込まれ、改行文字がそのままの状態になる。このため、行末文字CR(\r)やLF(\n)を含めることで、複数行にわたる検索ができるようになる
逆に「-Raw」オプションがなければ、Get-Contentコマンドは、ファイルをテキストモードで読み込み、パイプには分解された複数のテキスト行を送り出す。この場合、後続のSelect-Stringコマンドでは、これを1行1行個別に検索処理をするため、複数行にわたるパターンを検索することができず、行末文字も見つからない。
行末文字を扱えるかどうかは、コマンド自体の問題である。ファイルを直接読み込めるPowerShellの大半のコマンドは、テキストモードで動作している。これを理解しないと、Select-Stringコマンドで直接ファイルを読み込んだとき、行末文字が見つからなくて悩むことになりかねない。バイナリモードでファイルを扱いたいならば、必ずGet-Contentコマンドで「-Raw」オプションを使う。
テキストファイルと普通に呼んでいるため、世の中には「テキストファイル」という特別なファイルが存在するかのような気がしているが、実際には、テキストファイルは約束事でしかない。テキストファイルをテキストファイルとして成り立たせているのは、これを読み込むプログラムであるということは、きちんと理解しておいたほうがいいだろう。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第523回
PC
AI傾倒に一息入れて、既存のWindowsの改良を宣言するMicrosoft タスクバーを画面の上下左右に移動可能に!? -
第522回
PC
Windowsでも完全キーボード操作派は注目! PowerToysのコマンドパレット -
第521回
PC
Windowsでアプリをインストールしたときに警告が表示する「Defender SmartScreen」と「Smart App Control」 -
第520回
PC
WindowsターミナルのPreview版 v1.25では「操作」設定に専用エディタが導入 -
第519回
PC
「セキュアブート」に「TPM」に「カーネルDMA保護」、Windowsのセキュリティを整理 -
第518回
PC
WindowsにおけるUAC(ユーザーアカウント制御)とは何? 設定は変えない方がいい? -
第517回
PC
Windows 11の付箋アプリはWindowsだけでなく、スマホなどとも共有できる -
第516回
PC
今年のWindows 11には26H2以外に「26H1」がある!? 新種のCPUでのAI対応の可能性 -
第515回
PC
そもそも1キロバイトって何バイトなの? -
第514回
PC
Windows用のPowerToysのいくつかの機能がコマンドラインで制御できるようになった -
第513回
PC
Gmailで外部メール受信不可に! サポートが終わるPOPってそもそも何? - この連載の一覧へ











