Vra

As ek soms sukkel pad, waar een van my eie cmd skrifte verberg word (skaduwee) deur 'n ander program (vroeër op die pad), sou ek graag in staat wees om die volle pad na 'n program vind op die command Windows lyn, gegee net sy naam.

Is daar 'n gelykstaande aan die UNIX opdrag 'wat?

Op UNIX, which command druk die volledige pad van die gegewe opdrag om maklik te vind en te herstel hierdie oorskadu probleme.

Was dit nuttig?

Oplossing

Windows Server 2003 en later (dit wil sê enigiets na Windows XP 32 bit) verskaf die where.exe program wat nie 'n paar van wat which doen, al is dit ooreenstem met alle vorme van lêers, nie net uitvoerbare bevele. (Dit kom nie ooreen met ingeboude dop opdragte soos cd.) Dit sal selfs aanvaar wildcards, so where nt* soek alle lêers in jou %PATH% en huidige gids wie se name begin met nt.

Probeer where /? vir hulp.

Let daarop dat Windows PowerShell definieer where as 'n alias vir die Where-Object cmdlet , so as jy wil where.exe, moet jy die volle naam in plaas tipe weglating die .exe uitbreiding.

Ander wenke

Hoewel latere weergawes van Windows het 'n where opdrag, kan jy ook doen met Windows XP met behulp van die veranderlike wysigers omgewing, soos volg:

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

Jy hoef nie enige ekstra gereedskap nodig en dit is nie beperk tot PATH sedert jy enige omgewing veranderlike kan vervang (in die formaat pad, natuurlik) wat jy wil gebruik.


En as jy een wat kan hanteer al die uitbreidings in PATHEXT (soos Windows self doen) wil, hierdie een doen die truuk:

@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

Dit gee eintlik al die moontlikhede, maar jy kan dit aanpas baie maklik vir 'n spesifieke soektog reëls.

Onder PowerShell, Get-Command sal executables vind op enige plek in $Env:PATH.

Get-Command eventvwr

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

Dit vind ook PowerShell cmdlets, funksies, aliasse, lêers met persoonlike executables uitbreidings via $Env:PATHEXT, ens gedefinieer vir die huidige dop (nogal soortgelyk aan type -a foo Bash se) - maak dit 'n beter gaan-om as ander instrumente soos where.exe, which.exe , ens wat nie bewus is van hierdie PowerShell is beveel.

Dit vind executables met behulp van slegs 'n deel van die naam

gcm *disk*

CommandType     Name                             Version    Source
-----------     ----                             -------    ------
Alias           Disable-PhysicalDiskIndication   2.0.0.0    Storage
Alias           Enable-PhysicalDiskIndication    2.0.0.0    Storage
Function        Add-PhysicalDisk                 2.0.0.0    Storage
Function        Add-VirtualDiskToMaskingSet      2.0.0.0    Storage
Function        Clear-Disk                       2.0.0.0    Storage
Cmdlet          Get-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          New-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          Remove-PmemDisk                  1.0.0.0    PersistentMemory
Application     diskmgmt.msc                     0.0.0.0    C:\WINDOWS\system32\diskmgmt.msc
Application     diskpart.exe                     10.0.17... C:\WINDOWS\system32\diskpart.exe
Application     diskperf.exe                     10.0.17... C:\WINDOWS\system32\diskperf.exe
Application     diskraid.exe                     10.0.17... C:\WINDOWS\system32\diskraid.exe
...

Dit vind van persoonlike executables

Om ander nie-vensters executables (luislang, Ruby, perl, ens), lêeruitbreidings vind vir diegene executables moet bygevoeg word om die PATHEXT omgewing veranderlike (verstek na .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL) om lêers met die volgende uitbreidings te identifiseer in die PATH as uitvoerbare . As Get-Command ook vereer hierdie veranderlike, kan dit uitgebrei word om 'n lys persoonlike executables. Bv.

$Env:PATHEXT="$Env:PATHEXT;.dll;.ps1;.psm1;.py"     # temporary assignment, only for this shell's process

gcm user32,kernel32,*WASM*,*http*py

CommandType     Name                        Version    Source
-----------     ----                        -------    ------
ExternalScript  Invoke-WASMProfiler.ps1                C:\WINDOWS\System32\WindowsPowerShell\v1.0\Invoke-WASMProfiler.ps1
Application     http-server.py              0.0.0.0    C:\Users\ME\AppData\Local\Microsoft\WindowsApps\http-server.py
Application     kernel32.dll                10.0.17... C:\WINDOWS\system32\kernel32.dll
Application     user32.dll                  10.0.17... C:\WINDOWS\system32\user32.dll

Jy kan vinnig die opstel van 'n alias met sal which gcm (kort vorm van set-alias which get-command).

Meer inligting en voorbeelde kan gevind word onder die online help vir Get-Command .

In Windows PowerShell:

set-alias which where.exe

As jy PowerShell geïnstalleer (wat ek raai), kan jy die volgende opdrag gebruik as 'n rowwe ekwivalent (plaasvervanger programName vir die naam van jou uitvoerbare):

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

Meer is hier: My Manwich! PowerShell Watter

Die GnuWin32 gereedskap het which, saam met 'n hele rits ander Unix gereedskap.

In Windows CMD which noem where:

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

Cygwin is 'n oplossing. As jy nie omgee nie met behulp van 'n derde party oplossing, dan Cygwin is die pad om te gaan.

Cygwin gee jou die gerief van * nix in die Windows-omgewing (en jy kan dit gebruik in jou Windows command dop, of gebruik 'n * nix shell van jou keuse). Dit gee jou 'n hele leër van die * nix opdragte (soos which) vir Windows, en jy kan net sluit die gids in jou PATH.

In PowerShell, dit is gcm, wat geformatteerde inligting oor ander opdragte gee. As jy wil net pad uitvoerbare, gebruik .Source haal.

Byvoorbeeld: gcm git of (gcm git).Source

goedjies:

Gaan kry unxutils van hier af: http://sourceforge.net/projects/unxutils/

goud op vensters platforms, sit al die lekker unix nuts op 'n standaard Windows DOS. Gebruik dit vir die jaar.

Dit het 'n "wat" ingesluit. Let daarop dat dit kassensitief al is.

Let wel:. Om te installeer dit ontplof die rits iewers en voeg ... \ UnxUtils \ usr \ plaaslike \ wbin \ om jou stelsel pad env veranderlike

Ek het 'n funksie in my PowerShell profiel met die naam "wat '

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

Hier is wat die uitset lyk:

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:

As jy 'n gratis Pascal compiler kan vind, kan jy dit op te stel. Ten minste dit werk en toon die algoritme nodig.

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 existence 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 through 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.

Nie in voorraad Windows, maar dit is wat deur Dienste vir Unix en daar is 'n paar eenvoudige joernaal skrifte rondsweef dat dieselfde ding soos hierdie hierdie een .

Die beste weergawe van hierdie Ek het gevind op Windows is Joseph Nuweling se "Waar is die" nut, wat beskikbaar (met bron) is van sy webwerf .

Die artikel oor die ontwikkeling van "Waar is die" is die moeite werd om te lees.

Nie een van die Win32 hawens van Unix wat ek kon kry op die Internet is satistactory, want hulle het almal een of meer van hierdie tekortkominge:

  • Geen ondersteuning vir Windows PATHEXT veranderlike. (Watter definieer die lys van uitbreidings implicitely bygevoeg elke opdrag voor die skandering van die pad, en in watter volgorde.) (Ek gebruik 'n baie tcl skrifte, en geen publiek sigbaar wat hulpmiddel hulle kon kry.)
  • Geen ondersteuning vir cmd.exe kode bladsye, wat maak hulle paaie met nie-ASCII karakters vertoon verkeerdelik. (Ek is baie sensitief vir wat, met die C in my eerste naam: -))
  • Geen ondersteuning vir die verskillende search reëls in cmd.exe en die PowerShell command line. (Geen publiek sigbaar instrument sal vind .ps1 skrifte in 'n PowerShell venster, maar nie in 'n cmd venster!)

So ek uiteindelik het my eie wat, wat suports al die bogenoemde korrek te bereken.

daar beskikbaar: http://jf.larvoire.free.fr/progs/which.exe

Dit bondel lêer gebruik CMD veranderlike hantering van die opdrag wat in die pad sou word uitgevoer vind. Let wel:. Dat die huidige gids altyd gedoen voor die pad) en afhangende van watter API oproep word gebruik ander plekke is voor gesoek / na die pad

@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%)

Sien set /? vir hulp.

Jy kan eerste Git installeer vanaf aflaai Git , en dan open Git bash en type:

which app-name

Ek gebruik Gow (GNU op Windows), wat 'n ligte weergawe van Cygwin. Jy kan dit aan te gryp uit GitHub hier .

  

Gow (GNU op Windows) is die liggewig alternatief vir Cygwin. dit maak gebruik van   'n gerieflike Windows installeerder wat sowat 130 uiters installeer   nuttige open source UNIX programme saamgestel as moedertaal win32   binaries. Dit is ontwerp om so min as moontlik, sowat 10 MB te wees, as   in teenstelling met Cygwin wat kan hardloop meer as 100 MB, afhangende van   opsies. - Oor beskrywing (Brent R. Matzelle)

'n kiekie van 'n lys van instruksies ingesluit in Gow:

 Tik beeld beskrywing hier

Ek het hulpmiddel soortgelyk aan Ned BATCHELDER geskep

soek DLL en EXE lêers in PATH

Hoewel my instrument is primarly vir soek van verskeie dll weergawes dit toon meer inligting (datum, grootte, version) maar dit nie gebruik PATHEXT (Ek hoop om my instrument binnekort op te dateer).

Vir jou Windows XP gebruikers (wat geen where opdrag ingeboude), het ek geskrywe n "waar soos" command as 'n rubygem genoem whichr.

Om dit te installeer, installeer Ruby.

Toe

gem install whichr

Begin dit wil hê:

C:> whichr cmd_here

TCC en TCC / LE uit JPSoft is cmd.exe plaasvervangers wat beduidende funksies by te voeg. Relevant tot die vraag van die OP se which is 'n ingeboude command vir TCC familie opdrag verwerkers.

Ek het die which module van NPM gebruik vir 'n lang ruk, en dit werk baie goed: https: //www.npmjs.com/package/which Dit is 'n groot multi-platform alternatiewe.

Nou aangeskakel ek na die which wat kom met Git. Net toe te voeg tot jou pad die /usr/bin pad uit Git, wat gewoonlik by C:\Program Files\Git\usr\bin\which.exe. Die which binêre sal wees by C:\Program Files\Git\usr\bin\which.exe. Dit is vinniger en ook werk as wat verwag is.

Probeer hierdie

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top