Non riesco a trovare nulla su un equivalente di Powershell del where
comando da cmd
. Devo solo chiamarlo da cmd
o c'è qualcosa di più elegante in PS?
Non riesco a trovare nulla su un equivalente di Powershell del where
comando da cmd
. Devo solo chiamarlo da cmd
o c'è qualcosa di più elegante in PS?
Risposte:
Utilizzare il Get-Command
commandlet passandogli il nome dell'eseguibile. Popola la proprietà Path dell'oggetto restituito (di tipo ApplicationInfo ) con il percorso completamente risolto dell'eseguibile.
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
gcm
invece di digitare Get-Command
ogni volta l'intera parola
gcm notepad
ha funzionato perfettamente per me quando voglio solo vedere quale file sto chiamando.
Se stai solo cercando di avere la stessa funzionalità senza invocare cmd, puoi chiamare where.exe
da PowerShell, purché C:\Windows\System32
sia nel tuo percorso. Il comando where
(senza .exe) è alias Where-Object
, quindi basta specificare il 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
È praticamente quello che fa il vecchio where.exe ... c'erano funzionalità più specifiche che stai cercando di imitare?
Modifica: in risposta al commento di Joshua ... oh, vuoi cercare anche le variabili di ambiente PATH? Nessun problema.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
oh, you want to search your PATH environment variables too?
Uhm, sì, questo è il punto centrale per where
, altrimenti si può semplicemente utilizzare dir
. Der. :-P
where
non è un cmd
comando integrato . È un'applicazione standalone ( where.exe
), quindi in senso stretto PowerShell non "necessita di una sostituzione".
Quindi perché non where
funziona in PowerShell? Sembra non fare nulla:
PS C:\> where where
PS C:\>
Per impostazione predefinita, where
viene impostato un cmdlet PS incorporato.
PS C:\> get-help where
NAME
Where-Object
...
ALIASES
where
?
Bene, è bello sapere, ma c'è un modo per evitare di chiamare where-object
quando si tenta di chiamare where.exe
?
La risposta è si.
opzione 1
Chiama where.exe
con estensione. (Questo è un modo pratico per aggirare altri problemi di aliasing e prioritizzazione delle estensioni di file.)
PS C:\> where.exe where
C:\Windows\System32\where.exe
opzione 2
Rimuovi l'alias.
PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe
Note laterali
La risposta di zdan propone di usare Get-Command
come alternativa. Anche se è un po 'più dettagliato (anche quando si utilizza l' gcm
alias predefinito ), ha una funzionalità più ricca di where.exe
. Se utilizzato negli script, presta attenzione alle sottili differenze tra i due. Ad esempio, where.exe
restituisce tutte le corrispondenze, mentre Get-Command
restituisce solo il primo risultato a meno che non si includa il -TotalCount
parametro facoltativo .
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 infine, se rimuovi l' where
alias predefinito , potresti anche considerare di riassegnarlo come alias Get-Command
. (Ma questo probabilmente sarebbe di dubbia utilità.)
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:\>