Não consigo encontrar nada sobre o equivalente do Powershell ao wherecomando cmd. Devo apenas chamá-lo cmdou existe algo mais elegante no PS?
Não consigo encontrar nada sobre o equivalente do Powershell ao wherecomando cmd. Devo apenas chamá-lo cmdou existe algo mais elegante no PS?
Respostas:
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
gcmao invés de digitar toda a Get-Commandpalavra de cada vez
gcm notepadestá 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.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...
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
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:\>