2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PowerShell】パスが通っていない外部コマンドにパイプする小技

Last updated at Posted at 2020-07-02

地味にハマったので。

パスが通っている場合

Scoop でインストールすればイイ感じに設定してくれるので実行ファイル名だけで簡単に呼び出せます。

ls -name | peco.exe

.exe なしで ls -name | peco とさらに簡略化することもできますが、実行ファイルであることを明示しておいたほうが安心なので個人的には残すことが多いです。

パスが通っていない場合

パターン A: パスが固定

フルパスを指定します。
このときに引用符で囲んでしまうと文字列扱いになってエラーになります。

ls -name | C:\Users\tools\peco\peco.exe

パターン B: パスを動的に指定したい

ハマったのはこのパターン。

自作ツールをクラウド経由で同期して複数PCで使いたいとき、 PC によって変わるユーザー名部分に自動変数 $env:USERNAME で対処しようとしたのですが、 "C:\Users\$($env:USERNAME)\Dropbox\tool\mytool.exe" などと引用符で変数展開しようとすると上記の通り文字列扱いになって正常に動作しません。
Start-Process にパイプしてもエラーとなり、それなら -ArgumentList を使えばと思っても配列はただの空白区切り文字ととしてパラメータに渡されるらしく、期待する動作は叶いません。

正解は下記でした。

ls -name | & "C:\Users\$($env:USERNAME)\Dropbox\tool\mytool.exe"

実行演算子( call operator )の & を使えばよかったようです。スクリプトブロックの実行にばかり使っていた盲点でした( 参考サイト )。

& 単体で google 検索に引っかからずに苦戦していたところ、この記号が “ampersand” ということを知りました。検索スキルという意味でどちらかというとこの学びのほうが大きかったというオチ……。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?