バッチファイル中での指定は「%」と「!」に注意
しかし、バッチファイルの中では話が異なる。まず「%」を文字として使う場合には、環境変数名と関わりなく「%%」を指定する。これに対して「!」は、遅延環境変数の展開(以下、遅延展開)をしているかどうかでエスケープすべきかどうかが異なる。
遅延展開が禁止されている場合(デフォルト状態)、「!」には特殊文字として意味がなく通常文字として扱われる。このため「^」によるエスケープは無効で「^!」は「^!」のままになり、エスケープ文字を付けてはいけない。
しかし、「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でも同様にエスケープが必要になる特殊文字があり、こちらについてはまた別の機会に解説したい。
この連載の記事
-
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第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つに分かれる - この連載の一覧へ