Domanda Esiste un equivalente di "which" sulla riga di comando di Windows?


Poiché a volte ho problemi di percorso, in cui uno dei miei script cmd è nascosto (ombreggiato) da un altro programma (in precedenza sul percorso), mi piacerebbe essere in grado di trovare il percorso completo di un programma sulla riga di comando di Windows, dato solo il suo nome

Esiste un equivalente al comando UNIX 'which'?

Su UNIX, which command stampa il percorso completo del comando dato per trovare e riparare facilmente questi problemi di shadowing.


1896
2017-11-20 04:19


origine


risposte:


Windows Server 2003 e versioni successive (ad esempio, dopo Windows XP a 32 bit) forniscono where.exe programma che fa un po 'di cosa which fa, anche se corrisponde a tutti i tipi di file, non solo ai comandi eseguibili. (Non corrisponde ai comandi della shell incorporati come cd.) Accetterà anche i caratteri jolly, quindi where nt* trova tutti i file nel tuo %PATH% e la directory corrente di cui iniziano i nomi nt.

Provare where /? per un aiuto.

Si noti che Windows PowerShell definisce where come alias per il Where-Object cmdletquindi se vuoi where.exe, è necessario digitare il nome completo invece di omettere il .exe estensione.


2103
2017-11-20 05:52



Mentre versioni successive di Windows hanno un where comando, puoi farlo anche con Windows XP usando i modificatori di variabile di ambiente, come segue:

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

Non hai bisogno di strumenti extra e non è limitato a PATH dal momento che è possibile sostituire qualsiasi variabile d'ambiente (nel formato del percorso, ovviamente) che si desidera utilizzare.


E, se ne vuoi uno in grado di gestire tutte le estensioni in PATHEXT (come fa Windows stesso), questo fa il trucco:

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

In realtà restituisce tutte le possibilità, ma è possibile modificarlo abbastanza facilmente per specifiche regole di ricerca.


256
2017-11-20 05:48



Sotto PowerShell get-command troverà eseguibili ovunque $Env:PATH.

get-command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

Trova anche cmdlet di PowerShell, funzioni, alias, file con estensioni di eseguibili personalizzati tramite $Env:PATHEXT, ecc definito per la shell corrente (abbastanza simile a bash type -a foo) - rendendolo un migliore go-to di altri strumenti come where.exe, which.exe, ecc. che non sono a conoscenza di questi comandi di PowerShell.

Puoi rapidamente impostare un alias con sal which gcm (forma abbreviata di set-alias which get-command).


105
2017-11-26 02:07



In Windows PowerShell:

set-alias which where.exe

39
2017-11-30 23:00



Se hai installato PowerShell (che raccomando), puoi usare il seguente comando come equivalente approssimativo (sostituisci programName per il nome del tuo eseguibile):

($Env:Path).Split(";") | Get-ChildItem -filter programName*

Più qui: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



Il GnuWin32 gli strumenti hanno which, insieme a tutta una serie di altri strumenti Unix.


31
2017-11-20 06:44



In Windows CMD which chiamate where:

$ where php
C:\Program Files\PHP\php.exe

19
2018-04-01 12:02



Sorpreso che nessuno ha menzionato cygwin come una soluzione ancora. Se non ti dispiace usare una soluzione di terze parti, allora cygwin è la strada da percorrere.

Cygwin ti dà il comfort di * nix nell'ambiente Windows (e puoi usarlo nella shell dei comandi di Windows o usare una shell * nix a tua scelta). Ti dà un'intera serie di comandi * nix (come which) per Windows, e puoi semplicemente includere quella directory nel tuo PATH.


15
2017-10-12 17:02