外部コマンドを起動する
外部コマンドの起動には実行ファイルのパスを指定する。もし、PATH環境変数に、実行ファイルのあるディレクトリ(フォルダ)のパスが設定してあるなら、実行ファイル名のみでよく、拡張子(.exe、.com、.bat)は省略が可能だ。
外部コマンドの実行で注意するのは、PowerShellのエイリアスと衝突していないかどうかである。エイリアスとは別名のことで、わかりやすい、あるいは短い名前をコマンドに付けるものだ。これにより、ファイルのリストは、Get-ChildItemではなくdirやlsというコマンド名で実行できるようになる。
コマンド名の衝突だが、たとえばPowerShell 7では「where」を「Where-Object」のエイリアスとして登録してある。このため、where.exeを起動するつもりで「Where cmd.exe」などとすると、「Where-Object cmd.exe」というコマンドに解釈されエラーとなってしまう。
このようにPowerShellには、Windows標準コマンドと衝突しているエイリアスがあるため、慣れないうちは、外部コマンドの拡張子は省略しないほうが無難だ。なお、「Get-Alias」コマンドで現在設定されているエイリアスの一覧を見られる。とくにcmd.exeに慣れているユーザーは要注意である。
また、外部コマンドでつまづきやすい問題の1つにシングルクオート、ダブルクオートで括った文字列の扱いがある。PowerShellでは、どちらも文字列を表し、ダブルクオートで括られた文字列は、その中にある文字列を調べ、特定の記法があれば、これを解釈して値に置き換える「展開可能な文字列」となる。シングルクオートで括られた文字列は、展開がされない文字列となる。
たとえば、PowerShellでは、逆クオート文字(`)が特殊な記号の意味を打ち消す「エスケープ文字」となるが、これは、ダブルクオートで囲まれた文字列内で有効で、シングルクオートで括られた文字列では無効で逆クオート文字そのものになる。
PowerShellのコマンドラインでは、スペースが区切り文字となるのだが、スペースを含むパスを持つ外部コマンドはシングルクオート、ダブルクオートで括る必要がある。しかし、PowerShellでは単なる文字列なので、先頭にアンパサンド文字(&)を置き、文字列をコマンドとして解釈させる必要がある。
逆に、一部の外部コマンドは、文字列がダブルクオートで囲まれている必要がある。しかし、PowerShellでは、コマンドラインの解析が終わるとダブルクオートは消え、文字列だけがコマンドに渡される。このため、find.exeなどの実行がうまくいかない。
似たような問題にcacls.exeなどで使うカッコがある。こうした、PowerShell固有のコマンドライン解析が問題を起こす場合、解析を停止させる「停止解析トークン」(--%)を使って、PowerShellのコマンドラインをこれ以上、加工されないようにできる。たとえば、find.exeならば、
"abc" | C:\Windows\System32\find.exe --% "ab"
などとする(以前紹介したCoreUtilsのfind.exeでは結果が異なる点に注意)。
このほか、検索文字部分をシングルクオートで括る方法もある。
"abc" | C:\Windows\System32\find.exe '"ab"'
シングルクオートで囲った文字列の中では、ダブルクオート文字は意味を失い、自由に利用できる。どうしてもシングルクオート文字の中でシングルクオート文字を使いたい場合には、2つ連続させることで、単一のシングルクオート文字とすることができる。
逆も同じで、ダブルクオートで囲った文字列中では、シングルクオート文字は意味を失い、自由に利用できる。また、ダブルクオートを2つ連続させることで単一のダブルクオート文字とすることができる。文字列の問題は、引っかかりやすいので、このあたりは確実に理解しておく必要がある。
最後に、ファイルへのリダイレクトだが、PowerShellのコマンドラインでは、標準出力のファイルへのリダイレクト(コマンド > ファイルパス)だけが利用可能で、「<」による標準入力のリダイレクトは利用できない。また、「>」を使うと、テキストエンコードとしてUTF-16LEが使われるため、できれば使わないほうがよい。コマンドの出力結果をファイルに出力する場合には、Out-Fileコマンドをパイプラインの最後に置く。
今回はここまで。次回はPowerShellコマンドを使って、情報表示やその加工などについての使い方を見ていくことにする。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第536回
PC
Microsoft製のコンソールエディタMS-Editが2.0になり、文法ハイライト機能が搭載 -
第535回
PC
WSLコンテナーのプレビューを試す 今年はWSLに動きがありそうだ -
第534回
PC
Windows 11におけるアプリインストーラーとwinget -
第533回
PC
PCの世界ではすっかり存在感が薄くなった光学メディアをあらためて整理 -
第532回
PC
モニターの情報が含まれる「VESA EDID」をWindowsで調べる方法 -
第531回
PC
Windowsのコンソール上でUnix/Linuxの標準的なコマンドを動かす「Windows CoreUtils」 -
第530回
PC
Windows 11でタスクバーの位置の移動機能が復活するのは結局どうなった? プレビュー版の現状を見る -
第529回
PC
Windowsの標準スクリプト言語であるPowerShellの現状をあらためて紹介する -
第528回
PC
Windows 11の標準機能でメモリに問題がないかを診断する -
第527回
PC
Windowsがクラッシュする原因を究明する方法 AIを活用すると結構早い - この連載の一覧へ












