バッチファイル中での指定は「%」と「!」に注意
しかし、バッチファイルの中では話が異なる。まず「%」を文字として使う場合には、環境変数名と関わりなく「%%」を指定する。これに対して「!」は、遅延環境変数の展開(以下、遅延展開)をしているかどうかでエスケープすべきかどうかが異なる。
遅延展開が禁止されている場合(デフォルト状態)、「!」には特殊文字として意味がなく通常文字として扱われる。このため「^」によるエスケープは無効で「^!」は「^!」のままになり、エスケープ文字を付けてはいけない。
しかし、「setlocal ENABLEDELAYEDEXPANSION」を指定している場合、「!」は遅延展開を表す特殊文字となるため、文字「!」をWSL側に渡すには「^!」と指定する必要がある。
また、バッチファイルの中では、行頭の「@」には特殊な意味があるが、コマンドの前となる行頭でのみ特殊文字として扱われるため、基本的にはエスケープは不要である。なお、行頭の「@」には、その行をエコーバックしないで実行するという機能がある。
cmd.exeの内部コマンドを使う場合
cmd.exeの外部コマンド、つまり、実行ファイルのあるコマンドなら、WSL側で利用しても記述はさほど面倒にはならない。必ず「.exe」などの拡張子を付けることを忘れなければ問題ない。
たとえば、tasklist.exeの場合、cmd.exeを探してそのプロセスIDを降順(新しいプロセスが先頭)で表示するには
tasklist | wsl.exe -- grep 'cmd.exe' ^| sort -k 2rn
とするか、WSLを起動して
tasklist.exe | grep 'cmd.exe' | sort -k 2rn
とする。
WSL側ではWin32側のコマンド実行ファイルの拡張子を省略できないが、Linuxコマンド側のパイプ文字はエスケープしなくてよい。また、Win32コマンドとWin32コマンドをパイプでつなげる場合でもパイプ文字をエスケープさせる必要がない。このとき、パイプ文字の処理はWSL側で行なわれる。たとえば、上記のgrepの代わりにWin32のfindstrコマンドを使うなら、
tasklist.exe | findstr.exe cmd.exe | sort -k 2rn
とすることができる。
しかし、cmd.exeの内部コマンドは、たとえば、前記のassocなどに関しては、
cmd.exe /c assoc | grep -i 'Excel\.' | sort -t = -k 2
と記述する必要があるため、WSL側で実行したからといって記述が特に短くなるわけでもない。
日本語環境ではシフトJISに注意
日本語環境の場合、コマンド出力にシフトJIS文字が混ざる可能性があるという点にも注意が必要だ。このあたりの問題については、過去の連載で解説しているので参照してほしい(「Windows Subsystem for LinuxとWindows内の文字コード」)。 で一度解説しているので参照してほしい。
grepなどで「バイナリファイル (標準入力) に一致しました」「Binary file (standard input) matches」といったエラーが表示されるのは、UTF-8を想定しているのにシフトJIS文字を受け取ったからである。
nkfコマンドをWSL側にインストールしておき、シフトJISが混じる可能性がある場合にUTF-8に変換させておくといいだろう。たとえば、sc.exeコマンドの出力をgrepするような場合には、
sc query | wsl -- nkf -w8 ^| grep "DISPLAY_NAME:"
とすればよい。
cmd.exeでLinuxコマンドを使う場合、エスケープ文字「^」の使い方を覚えれば、比較的自由にLinuxコマンドを使うことができる。PowerShellでも同様にエスケープが必要になる特殊文字があり、こちらについてはまた別の機会に解説したい。
この連載の記事
-
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? -
第418回
PC
Windows 11のスマートフォン連携は新機能が追加されるなど、いまだ進化している - この連載の一覧へ