Equivalente a cmd's "where" no PowerShell

Respostas:

59

Use o Get-Commandcommandlet passando o nome do executável. Ele preenche a propriedade Path do objeto retornado (do tipo ApplicationInfo ) com o caminho totalmente resolvido para o executável.

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
zdan
fonte
8
Se você está usando este lote um, você pode abreviar o comando como gcmao invés de digitar toda a Get-Commandpalavra de cada vez
Moshe Katz
@MosheKatz Thank you! gcm notepadestá funcionando perfeitamente para mim quando eu só quero ver para qual arquivo estou chamando.
Shawn Wang
1
E isso, meninos e meninas, é como você complica demais as coisas úteis que já estavam certas. Se não estiver quebrado, não conserte.
AFP_555
Muito obrigado por este comando. Posso adicionar o tipo sem codificar o caminho.
Jason TEPOORTEN
22

Se você deseja apenas ter a mesma funcionalidade sem chamar o cmd, pode ligar where.exedo powershell, desde que C:\Windows\System32esteja no seu caminho. O comando where(sem o .exe) é um alias para Where-Object, portanto, basta especificar o nome completo.

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...
despenteado
fonte
8

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

Isso é basicamente o que o antigo where.exe faz ... havia alguma funcionalidade mais específica que você está tentando imitar?

Edit: Em resposta ao comentário de Joshua ... oh, você também deseja pesquisar suas variáveis ​​de ambiente PATH? Sem problemas.

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
Ryan Ries
fonte
1
"where" também procura no PATH também
Joshua McKinnon
3
oh, you want to search your PATH environment variables too? Hum, sim, esse é o ponto inteiro para where, caso contrário, você pode simplesmente usar dir. Der. :-P
21413 Synetech
3

wherenão é um cmdcomando incorporado . É um aplicativo independente ( where.exe), portanto, falando estritamente o PowerShell "não precisa de substituição".

Então, por que não wherefunciona no PowerShell? Parece não fazer nada:

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

Por padrão, whereé alias a um cmdlet PS interno.

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

Bem, isso é bom saber, mas existe uma maneira de evitar ligar where-objectao tentar ligar where.exe?

A resposta é sim.

Opção 1

Ligue where.execom ramal. (Esta é uma maneira prática de solucionar outros problemas de alias e de priorização de extensão de arquivo.)

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

opção 2

Remova o alias.

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

Notas laterais

A resposta de zdan propõe o uso Get-Commandcomo alternativa. Embora seja um pouco mais detalhado (mesmo ao usar o gcmalias padrão ), ele tem uma funcionalidade mais rica do que where.exe. Se usado em scripts, preste atenção às diferenças sutis entre os dois. Por exemplo, where.exeretorna todas as correspondências, enquanto Get-Commandretorna apenas o primeiro resultado, a menos que você inclua o -TotalCountparâmetro opcional .

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

E, finalmente, se você remover o wherealias padrão , considere também atribuí-lo como um alias para Get-Command. (Mas isso provavelmente seria um benefício duvidoso.)

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