web-dev-qa-db-ja.com

PowerShellでのcmdの「where」に相当

wherecmdコマンドに相当するPowershellについては何も見つからないようです。 cmdから呼び出すだけですか、それともPSにはもっとエレガントなものがありますか?

77
sunnyseas

使用 - Get-Command コマンドレットに実行可能ファイルの名前を渡します。返されたオブジェクト(タイプ ApplicationInfo )のPathプロパティに、実行可能ファイルへの完全に解決されたパスを設定します。

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
76
zdan

Cmdを呼び出さずに同じ機能を使用したい場合は、where.exeがパスにある限り、PowershellからC:\Windows\System32を呼び出すことができます。コマンドwhere(.exeなし)はWhere-Objectにエイリアスされているため、完全な名前を指定するだけです。

PS C:\Users\alec> where
cmdlet Where-Object at command pipeline position 1
...

PS C:\Users\alec> where.exe
The syntax of this command is:

WHERE [/R dir] [/Q] [/F] [/T] pattern...
26
mopsled

Get-ChildItem C:\SomeDir -Recurse *.dll

それは、古いwhere.exeが行うこととほぼ同じです...模倣しようとしているより具体的な機能はありましたか?

編集:ジョシュアのコメントに応じて...おお、PATH環境変数も検索したいですか?問題ない。

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
8
Ryan Ries

whereは組み込みのcmdコマンドではありません。これはスタンドアロンアプリケーション(where.exe)であるため、厳密に言うと、PowerShellを「置き換える必要はありません」。

では、なぜPowerShellでwhereが機能しないのでしょうか。それは何もしないようです:

PS C:\> where where
PS C:\>

デフォルトでは、whereは組み込みのPSコマンドレットにエイリアスされます。

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

ええと、それは知っておくべきことですが、where-objectを呼び出そうとするときにwhere.exeを呼び出さないようにする方法はありますか?

答えは、はい。

オプション1

拡張子を付けてwhere.exeを呼び出します。 (これは、他のエイリアシングやファイル拡張子の優先順位付けの問題を回避するための便利な方法です。)

PS C:\> where.exe where
C:\Windows\System32\where.exe

オプション2

エイリアスを削除します。

PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe

サイドノート

zdanの回答 は、代わりにGet-Commandを使用することを提案しています。 (デフォルトのgcmエイリアスを使用している場合でも)少し冗長ですが、where.exeよりも機能が豊富です。スクリプトで使用する場合は、両者の微妙な違いに注意してください。例えば。 where.exeはすべての一致を返しますが、オプションのGet-Commandパラメータを含めない限り、-TotalCountは最初の結果のみを返します。

PS C:\> where.exe notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
PS C:\> (gcm notepad).Path
C:\WINDOWS\system32\notepad.exe
PS C:\> (gcm notepad -TotalCount 5).Path
C:\WINDOWS\system32\notepad.exe
C:\WINDOWS\notepad.exe
PS C:\>

最後に、デフォルトのwhereエイリアスを削除する場合は、そのエイリアスをGet-Commandのエイリアスとして再割り当てすることも検討してください。 (しかし、これはおそらく疑わしい利益になるでしょう。)

PS C:\> Set-Alias where Get-Command
PS C:\> where notepad

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     notepad.exe                                        10.0.15... C:\WINDOWS\system32\notepad.exe


PS C:\> (where notepad).Path
C:\WINDOWS\system32\notepad.exe
PS C:\>
6
Disillusioned