Équivalent de «where» de cmd dans powershell

62

Je n'arrive pas à trouver quoi que ce soit à propos d'un équivalent de Powershell de la wherecommande cmd. Dois-je simplement l'appeler cmdou y a-t-il quelque chose de plus élégant dans PS?


la source
Une lecture intéressante que j'ai trouvée parfois sur Where.exe et Get-ChildItem: blogs.technet.com/b/heyscriptingguy/archive/2010/07/24/…
Shawn Melton

Réponses:

59

Utilisez la Get-Commandcommandlet en lui donnant le nom de l’exécutable. Il renseigne la propriété Path de l'objet renvoyé (de type ApplicationInfo ) avec le chemin d'accès entièrement résolu à l'exécutable.

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
zdan
la source
8
Si vous vous trouvez souvent en train d'utiliser cela, vous pouvez abréger la commande au gcmlieu de taper le Get-Commandmot en entier à chaque fois
Moshe Katz
@MosheKatz Merci! gcm notepada fonctionné parfaitement pour moi quand je veux juste voir quel fichier j'appelle.
Shawn Wang
1
Et ceci, garçons et filles, est la façon dont vous compliquez exagérément les choses utiles qui avaient déjà raison. Si ce n'est pas cassé, ne le répare pas.
AFP_555
Merci beaucoup pour cette commande. Je peux ajouter-type sans coder en dur le chemin.
Jason TEPOORTEN le
22

Si vous souhaitez simplement disposer de la même fonctionnalité sans invoquer cmd, vous pouvez appeler à where.exepartir de powershell, tant que cela se C:\Windows\System32trouve sur votre chemin. La commande where(sans le fichier .exe) est associée à un alias. Indiquez Where-Objectdonc simplement le nom complet.

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...
lavé
la source
8

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

C'est à peu près ce que l'ancien where.exe fait ... y avait-il une fonctionnalité plus spécifique que vous essayez d'imiter?

Edit: En réponse au commentaire de Joshua ... oh, vous voulez aussi rechercher vos variables d'environnement PATH? Aucun problème.

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
Ryan Ries
la source
1
"où" cherche aussi dans le PATH
Joshua McKinnon
3
oh, you want to search your PATH environment variables too? Euh, oui, c'est le point entier à where, sinon vous pouvez simplement utiliser dir. Der. :-P
Synetech
4

wheren'est pas une cmdcommande intégrée . Il s'agit d'une application autonome ( where.exe), de sorte que PowerShell à proprement parler n'a pas besoin d'être remplacé.

Alors, pourquoi ne wherefonctionne pas dans PowerShell? Il semble ne rien faire:

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

Par défaut, l' wherealias est associé à une applet de commande PS intégrée.

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

C'est bon à savoir, mais y a-t-il un moyen d'éviter d'appeler where-objectlorsque vous essayez d'appeler where.exe?

La réponse est oui.

Option 1

Appeler where.exeavec extension. (Il s'agit d'un moyen pratique de résoudre d'autres problèmes d'aliasing et de priorisation des extensions de fichiers.)

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

Option 2

Supprimer l'alias.

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

Notes de côté

La réponse de zdan propose d'utiliser Get-Commandl'alternative. Bien qu'il soit un peu plus détaillé (même si vous utilisez l' gcmalias par défaut ), il a des fonctionnalités plus riches que where.exe. Si vous utilisez un script, faites attention aux différences subtiles entre les deux. Par exemple, where.exerenvoie toutes les correspondances, alors que Get-Commandne renvoie que le premier résultat à moins d'inclure le -TotalCountparamètre facultatif .

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:\>

Enfin, si vous supprimez l' wherealias par défaut , vous pouvez également envisager de le réaffecter en tant qu'alias Get-Command. (Mais cela aurait probablement un avantage douteux.)

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:\>
Désabusé
la source