2808 Stimmen

Gibt es ein Äquivalent zu "which" in der Windows-Befehlszeile?

Da ich manchmal Pfadprobleme habe, bei denen eines meiner eigenen cmd-Skripte von einem anderen Programm (das weiter oben im Pfad liegt) verdeckt (überschattet) wird, würde ich gerne den vollständigen Pfad zu einem Programm in der Windows-Befehlszeile finden können, wenn ich nur seinen Namen angeben kann.

Gibt es eine Entsprechung für den UNIX-Befehl 'which'?

Unter UNIX, which command gibt den vollständigen Pfad des angegebenen Befehls aus, um diese Schattenprobleme leicht zu finden und zu beheben.

0 Stimmen

Was bedeutet "welches" unter Unix?

3 Stimmen

Foredecker: "which" sucht im PATH nach der ausführbaren Datei, die ausgeführt wird, wenn Sie an der Shell-Eingabeaufforderung einen Befehl eingeben.

3 Stimmen

Wenn Sie z.B. 5 Versionen von Java installiert haben und nicht wissen, welche verwendet wird, können Sie "which java" eingeben und Sie erhalten den PATH zum Binary

11voto

Jon Court Punkte 119

Holen Sie sich unxutils von hier: http://sourceforge.net/projects/unxutils/

gold auf Windows-Plattformen, stellt alle netten Unix-Dienstprogramme auf einem Standard-Windows-DOS zur Verfügung. Ich benutze es schon seit Jahren.

Es enthält ein 'welches'. Beachten Sie jedoch die Groß- und Kleinschreibung.

NB: zu installieren es explodieren die Zip irgendwo und fügen Sie ... \UnxUtils\usr\local\wbin\ zu Ihrer Systempfad-Umgebungsvariable.

2 Stimmen

Groß- und Kleinschreibung wird nicht unterschieden, außerdem muss ich sagen, welche java.exe statt welche java - Windows 7

0 Stimmen

Es gibt allerdings ein paar Frustrationen, die mit Zeilenumbrüchen zu tun haben; grep zum Beispiel findet EOL nicht, ohne dass Sie ein . für die \r. Es ist aber sicher eine 99%ige Lösung!

0 Stimmen

Ja, es wird nicht zwischen Groß- und Kleinschreibung unterschieden, allerdings wird bei Dateinamen in Windows standardmäßig auch nicht zwischen Groß- und Kleinschreibung unterschieden.

10voto

Wenn Sie einen freien Pascal-Compiler finden, können Sie dies kompilieren. Zumindest funktioniert es und zeigt den notwendigen Algorithmus.

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.

25 Stimmen

Wow, es gibt also immer noch Leute, die Pascal benutzen? :-)

7 Stimmen

Ich kann mir vorstellen, dass es sie gibt. Aber ich nicht. Haben Sie die Zeile program_date = '17. März 1994' gesehen;

2 Stimmen

Die Einheit my_funk; ist nicht notwendig. Danke für die Veröffentlichung eines Pascal-Programms, das mich an meine Jugend erinnert! Es ist so schade, dass Pascal sich nicht weiterentwickelt hat.

8voto

Robert Gamble Punkte 101657

Nicht auf Lager Windows, aber es wird bereitgestellt von Dienste für Unix und es gibt mehrere einfache Batch-Skripte, die dasselbe bewirken, z. B. das folgende diese .

1 Stimmen

Allerdings gibt der von Ihnen verlinkte Befehl nur die PATH-Variable aus und prüft nicht einmal, ob die Datei dort gefunden wird.

7voto

Tim Lesher Punkte 6062

Die beste Version, die ich unter Windows gefunden habe, ist Joseph Newcomers "whereis"-Hilfsprogramm, das (mit Quellcode) verfügbar ist unter sein Standort .

Der Artikel über die Entwicklung von "whereis" ist lesenswert.

1 Stimmen

Späte Bemerkung: whereis hat Probleme, 64-Bit ausführbare Dateien unter Win 7 64-Bit zu finden.

7voto

hamidreza samsami Punkte 379

Sie können Git zunächst von Herunterladen von Git und öffnen Sie dann Git Bash und geben Sie ein:

which app-name

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X