Não consigo encontrar nada sobre o equivalente do Powershell ao where
comando cmd
. Devo apenas chamá-lo cmd
ou existe algo mais elegante no PS?
Não consigo encontrar nada sobre o equivalente do Powershell ao where
comando cmd
. Devo apenas chamá-lo cmd
ou existe algo mais elegante no PS?
Respostas:
Use o Get-Command
commandlet 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
gcm
ao invés de digitar toda a Get-Command
palavra de cada vez
gcm notepad
está funcionando perfeitamente para mim quando eu só quero ver para qual arquivo estou chamando.
Se você deseja apenas ter a mesma funcionalidade sem chamar o cmd, pode ligar where.exe
do powershell, desde que C:\Windows\System32
esteja 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...
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
}
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
where
não é um cmd
comando incorporado . É um aplicativo independente ( where.exe
), portanto, falando estritamente o PowerShell "não precisa de substituição".
Então, por que não where
funciona 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-object
ao tentar ligar where.exe
?
A resposta é sim.
Opção 1
Ligue where.exe
com 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-Command
como alternativa. Embora seja um pouco mais detalhado (mesmo ao usar o gcm
alias 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.exe
retorna todas as correspondências, enquanto Get-Command
retorna apenas o primeiro resultado, a menos que você inclua o -TotalCount
parâ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 where
alias 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:\>