símbolo sistema sirve simbolo que para linea comandos basicos windows command-line path-variables

sistema - ¿Hay un equivalente de ''cuál'' en la línea de comandos de Windows?



simbolo del sistema comandos (22)

Bajo PowerShell, get-command encontrará ejecutables en cualquier lugar de $Env:PATH .

get-command eventvwr CommandType Name Definition ----------- ---- ---------- Application eventvwr.exe c:/windows/system32/eventvwr.exe Application eventvwr.msc c:/windows/system32/eventvwr.msc

También encuentra cmdlets de powershell, funciones, alias, archivos con extensiones ejecutables personalizadas a través de $Env:PATHEXT , etc., definidas para el shell actual (muy similar al type -a foo de bash type -a foo ), lo que lo convierte en una opción mejor que otras herramientas como where.exe , which.exe , etc., que desconocen estos comandos de PowerShell.

Puede configurar rápidamente un alias con sal which gcm (forma corta de set-alias which get-command ).

Como a veces tengo problemas con la ruta, donde otro programa (anteriormente en la ruta) oculta una de mis propias secuencias de comandos de cmd, me gustaría poder encontrar la ruta completa a un programa en la línea de comandos de Windows solo su nombre

¿Hay un equivalente al comando UNIX ''cuál''?

En UNIX, which command imprime la ruta completa del comando dado para encontrar y reparar fácilmente estos problemas de sombreado.


En PowerShell, es gcm , que proporciona información formateada sobre otros comandos. Si desea recuperar solo la ruta al ejecutable, use .Source .

Por ejemplo: gcm git o (gcm git).Source

Tidbits:


En Windows CMD which llama a where :

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


En Windows PowerShell:

set-alias which where.exe


Este archivo por lotes utiliza el manejo de variables CMD para encontrar el comando que se ejecutará en la ruta. Nota: el directorio actual siempre se realiza antes de la ruta) y, dependiendo de qué llamada de API se use, se buscarán otras ubicaciones antes / después de la ruta.

@echo off echo. echo PathFind - Finds the first file in in a path echo ======== = ===== === ===== ==== == == = ==== echo. echo Searching for %1 in %path% echo. set a=%~$PATH:1 If "%a%"=="" (Echo %1 not found) else (echo %1 found at %a%)

Ver set /? por ayuda


Estoy usando GOW (Gnu en Windows) que es una versión ligera de cygwin. Puedes agarrarlo desde github here.

Gow (Gnu en Windows) es la alternativa ligera a Cygwin. Utiliza un conveniente instalador de Windows que instala alrededor de 130 aplicaciones UNIX de código abierto extremadamente útiles compiladas como binarios nativos de win32. Está diseñado para ser lo más pequeño posible, aproximadamente 10 MB, a diferencia de Cygwin, que puede funcionar con más de 100 MB, según las opciones. - Sobre la descripción (Brent R. Matzelle)

Captura de pantalla de una lista de comandos incluidos en GOW.


He creado una herramienta similar a Ned Batchelder:

Buscando archivos .dll y .exe en PATH

Si bien mi herramienta es primordial para la búsqueda de varias versiones dll, muestra más información (fecha, tamaño, versión) pero no usa PATHEXT (espero actualizar mi herramienta pronto).


He utilizado el módulo de npm desde hace bastante tiempo, y funciona muy bien: https://www.npmjs.com/package/which Es una excelente alternativa multiplataforma.

Ahora cambié a la que viene con Git. Simplemente agregue a su ruta la ruta /usr/bin de Git, que generalmente se encuentra en C:/Program Files/Git/usr/bin/which.exe . El binario que estará en C:/Program Files/Git/usr/bin/which.exe . Es más rápido y también funciona como se espera.


La mejor versión de esto que he encontrado en Windows es la utilidad "whereis" de Joseph Newcomer, que está disponible (con fuente) en su sitio .

Vale la pena leer el artículo sobre el desarrollo de "whereis".


Las herramientas GnuWin32 tienen which , junto con un montón de otras herramientas Unix.


Ninguno de los puertos Win32 de Unix que pude encontrar en Internet son satistactory, porque todos tienen uno o más de estos defectos:

  • No hay soporte para la variable Windows PATHEXT. (Lo que define la lista de extensiones agregadas implícitamente a cada comando antes de explorar la ruta y en qué orden). (Utilizo muchos scripts tcl y no estoy disponible públicamente qué herramienta podría encontrarlos).
  • No es compatible con las páginas de códigos cmd.exe, lo que hace que muestren incorrectamente las rutas con caracteres que no son ASCII. (Soy muy sensible a eso, con el ç en mi primer nombre :-))
  • No se admiten las distintas reglas de búsqueda en cmd.exe y la línea de comandos de PowerShell. (Ninguna herramienta disponible públicamente encontrará scripts .ps1 en una ventana de PowerShell, ¡pero no en una ventana de cmd!)

Así que eventualmente escribí el mío, el cual soporta todo lo anterior correctamente.

Disponible allí: http://jf.larvoire.free.fr/progs/which.exe


No sé si esto ayuda. Publicado como respuesta porque no sé cómo dar formato al código en los comentarios (¿ayuda?)

Si puede encontrar un compilador de pascal gratuito, puede compilar esto o enviarme un correo electrónico y puedo intentar desenterrar uno, o enviar por correo el exe o publicarlo en algún lugar. Publico el código, por mal que esté, porque al menos funciona y muestra el algoritmo necesario.

program Whence (input,output); Uses Dos, my_funk; Const program_version = ''1.00''; program_date = ''17 March 1994''; VAR path_str : string; command_name : NameStr; command_extension : ExtStr; command_directory : DirStr; search_dir : DirStr; result : DirStr; procedure Check_for (file_name : string); { check existance of the passed parameter. If exists, then state so } { and exit. } begin if Fsearch(file_name,'''') <> '''' then begin WriteLn(''Dos command = '',Fexpand(file_name)); Halt(0); { structured ? whaddayamean structured ? } end; end; function Get_next_dir : DirStr; { Returns the next directory from the path variable, truncating the } { variable every time. Implicit input (but not passed as parameter) } { is, therefore, path_str } var semic_pos : Byte; begin semic_pos := Pos('';'',path_str); if (semic_pos = 0) then begin Get_next_dir := ''''; Exit; end; result := Copy(Path_str,1,(semic_pos - 1)); { return result } { hmm! although *I* never reference a Root drive (my directory tree) } { is 1/2 way structured), some network logon software which I run } { does (it adds Z:/ to the path). This means that I have to allow } { path entries with & without a terminating backslash. I''ll delete } { anysuch here since I always add one in the main program below. } if (Copy(result,(Length(result)),1) = ''/') then Delete(result,Length(result),1); path_str := Copy(path_str,(semic_pos + 1), (length(path_str) - semic_pos)); Get_next_dir := result; end; { of function get_next_dir } begin { the following is a kludge which makes the function Get_next_dir easier } { to implement. By appending a semi-colon to the end of the path } { Get_next_dir doesn''t need to handle the special case of the last entry } { which normally doesn''t have a semic afterwards. It may be a kludge, } { but it''s a documented kludge (you might even call it a refinement). } path_str := GetEnv(''Path'') + '';''; if (paramCount = 0) then begin WriteLn(''Whence : V'',program_version,'' from '',program_date); Writeln; WriteLn(''Usage : WHENCE command[.extension]''); WriteLn; WriteLn(''Whence is a ''''find file''''type utility witha difference''); Writeln(''There are are already more than enough of those :-)''); Write (''Use Whence when you''''re not sure where a command which you ''); WriteLn(''want to invoke''); WriteLn(''actually resides.''); Write (''If you intend to invoke the command with an extension e.g ''); Writeln(''"my_cmd.exe param"''); Write (''then invoke Whence with the same extension e.g ''); WriteLn(''"Whence my_cmd.exe"''); Write (''otherwise a simple "Whence my_cmd" will suffice; Whence will ''); Write (''then search the current directory and each directory in the ''); Write (''for My_cmd.com, then My_cmd.exe and lastly for my_cmd.bat, ''); Write (''just as DOS does''); Halt(0); end; Fsplit(paramStr(1),command_directory,command_name,command_extension); if (command_directory <> '''') then begin WriteLn(''directory detected *'',command_directory,''*''); Halt(0); end; if (command_extension <> '''') then begin path_str := Fsearch(paramstr(1),''''); { current directory } if (path_str <> '''') then WriteLn(''Dos command = "'',Fexpand(path_str),''"'') else begin path_str := Fsearch(paramstr(1),GetEnv(''path'')); if (path_str <> '''') then WriteLn(''Dos command = "'',Fexpand(path_str),''"'') else Writeln(''command not found in path.''); end; end else begin { O.K, the way it works, DOS looks for a command firstly in the current } { directory, then in each directory in the Path. If no extension is } { given and several commands of the same name exist, then .COM has } { priority over .EXE, has priority over .BAT } Check_for(paramstr(1) + ''.com''); { won''t return if file is found } Check_for(paramstr(1) + ''.exe''); Check_for(paramstr(1) + ''.bat''); { not in current directory, search thru path .... } search_dir := Get_next_dir; while (search_dir <> '''') do begin Check_for(search_dir + ''/' + paramstr(1) + ''.com''); Check_for(search_dir + ''/' + paramstr(1) + ''.exe''); Check_for(search_dir + ''/' + paramstr(1) + ''.bat''); search_dir := Get_next_dir; end; WriteLn(''DOS command not found : '',paramstr(1)); end; end.


Para ustedes, los usuarios de XP (que no tienen ningún comando incorporado), he escrito un comando "donde me gusta" como un rubygem llamado whichr

Para instalarlo, instala ruby.

entonces

gem install whichr

corre como

c:/>whichr cmd_here



Si bien las versiones posteriores de Windows tienen un comando where , también puede hacer esto con Windows XP utilizando los modificadores de la variable de entorno, de la siguiente manera:

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

No necesita herramientas adicionales y no está limitado a PATH ya que puede sustituir cualquier variable de entorno (en el formato de ruta, por supuesto) que desee usar.

Y, si quieres una que pueda manejar todas las extensiones en PATHEXT (como lo hace el propio Windows), este hace el truco:

@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

En realidad, devuelve todas las posibilidades, pero puedes modificarlo con bastante facilidad para reglas de búsqueda específicas.



Sorprendido de que nadie haya mencionado aún a cygwin como una solución. Si no le importa usar una solución de terceros, entonces cygwin es el camino a seguir.

Cygwin le brinda la comodidad de * nix en el entorno de Windows (y puede usarlo en su shell de comandos de Windows, o usar un shell * nix de su elección). Te da una gran cantidad de comandos * nix (como which ) para Windows, y puedes incluir ese directorio en tu PATH .


TCC y TCC / LE de JPSoft son reemplazos de CMD.EXE que agregan una funcionalidad significativa. Pertinente a la pregunta del OP, which es un comando integrado para los procesadores de comandos de la familia TCC.


Tengo una función en mi perfil de PowerShell llamada ''which''

function which { get-command $args[0]| format-list }

Así es como se ve la salida:

PS C:/Users/fez> which python Name : python.exe CommandType : Application Definition : C:/Python27/python.exe Extension : .exe Path : C:/Python27/python.exe FileVersionInfo : File: C:/Python27/python.exe InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language:


Vaya a obtener unxutils desde aquí: http://sourceforge.net/projects/unxutils/

oro en las plataformas de Windows, pone todas las utilidades agradables de Unix en un Windows estándar DOS. Lo he estado usando por años.

Tiene un ''que'' incluido. Tenga en cuenta que es sensible a las mayúsculas aunque

NB: para instalarlo, haga explotar el archivo zip en algún lugar y agregue ... / UnxUtils / usr / local / wbin / a su variable env del sistema de ruta.


Windows Server 2003 y versiones posteriores (es decir, cualquier cosa después de Windows XP de 32 bits) proporcionan el programa where.exe que hace algo de lo which hace, aunque coincide con todos los tipos de archivos, no solo con comandos ejecutables. (No coincide con los comandos de shell incorporados como cd ). Incluso aceptará comodines, de modo que where nt* encuentre todos los archivos en %PATH% y el directorio actual cuyos nombres comiencen con nt .

Intenta where /? por ayuda

Tenga en cuenta que Windows PowerShell define where es un alias para el cmdlet Where-Object , por lo que si desea where.exe , debe escribir el nombre completo en lugar de omitir la extensión .exe .


Windows no está disponible, pero es proporcionado por Servicios para Unix y hay varios scripts de lotes simples que flotan alrededor y logran lo mismo que este .