Parece que no puedo encontrar nada sobre un Powershell equivalente al where
comando de cmd
. ¿Debo llamarlo cmd
o hay algo más elegante en PS?
Parece que no puedo encontrar nada sobre un Powershell equivalente al where
comando de cmd
. ¿Debo llamarlo cmd
o hay algo más elegante en PS?
Respuestas:
Use el Get-Command
comando pasando el nombre del ejecutable. Rellena la propiedad Path del objeto devuelto (de tipo ApplicationInfo ) con la ruta completamente resuelta al ejecutable.
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
gcm
lugar de escribir la Get-Command
palabra completa cada vez
gcm notepad
ha funcionado perfectamente para mí cuando solo quiero ver a qué archivo estoy llamando.
Si solo busca tener la misma funcionalidad sin invocar cmd, puede llamar where.exe
desde powershell, siempre que C:\Windows\System32
esté en su camino. El comando where
(sin el .exe) tiene un alias Where-Object
, así que solo especifique el nombre 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
Eso es más o menos lo que hace el viejo where.exe ... ¿había una funcionalidad más específica que intentas imitar?
Editar: En respuesta al comentario de Joshua ... oh, ¿también quieres buscar en tus variables de entorno PATH? No hay problema.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
oh, you want to search your PATH environment variables too?
Um, sí, ese es el punto entero que where
, de lo contrario sólo se puede utilizar dir
. Der. :-P
where
No es un cmd
comando incorporado . Es una aplicación independiente ( where.exe
), por lo que, estrictamente hablando, PowerShell no "necesita un reemplazo".
Entonces, ¿por qué no where
funciona en PowerShell? Parece no hacer nada:
PS C:\> where where
PS C:\>
De forma predeterminada, where
tiene un alias para un cmdlet PS incorporado.
PS C:\> get-help where
NAME
Where-Object
...
ALIASES
where
?
Bueno, es bueno saberlo, pero ¿hay alguna manera de evitar llamar where-object
cuando intentas llamar where.exe
?
La respuesta es sí.
Opción 1
Llamada where.exe
con extensión. (Esta es una forma práctica de solucionar otros problemas de alias y de priorización de extensiones de archivo).
PS C:\> where.exe where
C:\Windows\System32\where.exe
opcion 2
Elimina el alias.
PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe
Notas al margen
La respuesta de zdan propone usar Get-Command
como alternativa. Aunque es un poco más detallado (incluso cuando se usa el gcm
alias predeterminado ), tiene una funcionalidad más rica que where.exe
. Si se usa en secuencias de comandos, preste atención a las sutiles diferencias entre los dos. Por ejemplo, where.exe
devuelve todas las coincidencias, mientras que Get-Command
solo devuelve el primer resultado a menos que incluya el -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:\>
Y finalmente, si elimina el where
alias predeterminado , también podría considerar reasignarlo como un alias Get-Command
. (Pero esto probablemente sería de dudoso beneficio).
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:\>