web-dev-qa-db-fra.com

Équivalent de "where" de cmd dans powershell

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

51
sunnyseas

Utilisez la Get-Command en lui transmettant 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
48
zdan

Si vous souhaitez simplement disposer de la même fonctionnalité sans appeler cmd, vous pouvez appeler where.exe à partir de powershell, tant que C:\Windows\System32 est sur votre chemin. La commande where (sans le fichier .exe) est associée à Where-Object; spécifiez donc 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...
20
mopsled

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
}
8
Ryan Ries

where n'est pas une commande construite dans cmd. Il s'agit d'une application autonome (where.exe). Par conséquent, PowerShell à proprement parler n'a pas "besoin d'être remplacé".

Alors pourquoi where ne fonctionne-t-il pas dans PowerShell? Il semble ne rien faire:

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

Par défaut, where 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-object en essayant d'appeler where.exe?

La réponse est oui.

Option 1

Appelez where.exe avec extension. (Il s'agit d'un moyen pratique de résoudre d'autres problèmes d'aliasing et de priorité 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 annexes

La réponse de zdan propose d'utiliser Get-Command comme alternative. Bien qu'il soit un peu plus détaillé (même si vous utilisez l'alias par défaut gcm), 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.exe renvoie toutes les correspondances, alors que Get-Command renvoie uniquement le premier résultat, à moins d'inclure le paramètre facultatif -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:\>

Enfin, si vous supprimez l'alias par défaut where, vous pouvez également envisager de le réaffecter comme alias à Get-Command. (Mais ce serait 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:\>
0
Disillusioned