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?
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
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...
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
}
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:\>