Non riesco a trovare nulla su un equivalente di Powershell del wherecomando da cmd. Devo solo chiamarlo da cmdo c'è qualcosa di più elegante in PS?
Non riesco a trovare nulla su un equivalente di Powershell del wherecomando da cmd. Devo solo chiamarlo da cmdo c'è qualcosa di più elegante in PS?
Risposte:
Utilizzare il Get-Commandcommandlet 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
gcminvece di digitare Get-Commandogni volta l'intera parola
gcm notepadha 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.exeda PowerShell, purché C:\Windows\System32sia 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
wherenon è un cmdcomando integrato . È un'applicazione standalone ( where.exe), quindi in senso stretto PowerShell non "necessita di una sostituzione".
Quindi perché non wherefunziona in PowerShell? Sembra non fare nulla:
PS C:\> where where
PS C:\>
Per impostazione predefinita, whereviene 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-objectquando si tenta di chiamare where.exe?
La risposta è si.
opzione 1
Chiama where.execon 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-Commandcome alternativa. Anche se è un po 'più dettagliato (anche quando si utilizza l' gcmalias predefinito ), ha una funzionalità più ricca di where.exe. Se utilizzato negli script, presta attenzione alle sottili differenze tra i due. Ad esempio, where.exerestituisce tutte le corrispondenze, mentre Get-Commandrestituisce solo il primo risultato a meno che non si includa il -TotalCountparametro 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' wherealias 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:\>