Fügen Sie der PATH-Variablen mit einem einzigen Eintrag ein Verzeichnis und alle Unterverzeichnisse hinzu

19

Ich habe ein Verzeichnis in meinem Home-Ordner, in dem ich die Befehlszeilensoftware (CMD_Software) ablege. Ich habe jede Software in einem eigenen Verzeichnis innerhalb von CMD_Software abgelegt, um Unordnung zu vermeiden.

Ich möchte einen einzelnen Eintrag in meiner PATH-Variablen vornehmen, der den Zugriff auf CMD_Software und alle darin enthaltenen Verzeichnisse über die Befehlszeile ermöglicht.

Ich habe es versucht, C:\Users\myuser\CMD_Software\*aber das hat nichts gebracht. Das ist der Punkt, an dem mir die Ideen ausgehen.

Bitte beachten Sie, dass ich im Terminal nicht versuche, einen neuen Pfad festzulegen. Ich versuche, einen neuen Pfad in den "Umgebungsvariablen" festzulegen, die auf der Registerkarte "Erweitert" der Systemeigenschaften verfügbar sind.

Landon Brainard
quelle
Haben Sie etwas wie "C: \ Users \ myuser \ CMD_Software *" ausprobiert?
Terdon
4
Ich denke nicht, dass das möglich ist.
Harry Johnston

Antworten:

16

Die Variable PATH unterstützt keine Platzhalter oder Rekursionen. Dies ist beabsichtigt.

Es gibt zwei mögliche Problemumgehungen, die ich gelegentlich verwendet habe:

  • Erstellen Sie ein Verzeichnis mit einfachen Batch-Dateien und fügen Sie dieses Verzeichnis dem PATH hinzu. Jede Batch-Datei kann das gewünschte Programm starten, zum Beispiel:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    Die erste Zeile ist ein Kommentar, die zweite Zeile beginnt damit @, dass der ausgeführte Befehl nicht angezeigt wird, und %*wird verwendet, um Befehlszeilenargumente an die EXE-Datei zu übergeben.

  • Fügen Sie Aliasnamen zu CMD.EXE hinzu:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Dies bedeutet im Wesentlichen, dass CMD_Softwarein der Eingabeaufforderung alles nach dem Gleichheitszeichen steht. Das $*wird durch die angegebenen Argumente ersetzt.

Ich bevorzuge den zweiten Ansatz, da Sie alle Aliase in einer einzigen Datei gruppieren können (siehe den Schalter "/ MACROFILE" in DOSKEY /?) Und ihn automatisch ausführen lassen können, wenn der Befehlsinterpreter eine Registrierungseinstellung verwendet (siehe "AutoRun" - Eingabe) CMD /?).

Ein Nachteil der zweiten Methode ist, dass Aliase nur am Anfang einer Befehlszeile funktionieren. Dies kann ein Problem sein, wenn Sie Befehle verketten möchten. CLS & CMD_SoftwareDies funktioniert beispielsweise nur, wenn Sie den Alias ​​in Klammern in eine separate Zeile setzen:

CLS & (
CMD_Software
)

Wann immer dies zu einem Problem wird, greife ich einfach auf den Batch-File-Ansatz zurück.

efotinis
quelle
Vielen Dank! Die erste Methode funktioniert bei mir sehr gut, hauptsächlich, weil ich mich nicht mit der Registrierung herumschlagen muss, wenn ich meine Daten zwischen Computern übertrage. Es ist auch ziemlich aufgeräumt und praktisch, da Sie nur ein kleines bisschen mehr Zeit für das Erstellen einer Bat-Datei aufwenden müssen, wenn Sie das Dienstprogramm erhalten.
Cyqsimon
Leider muss ich meine bisherige Aussage so schnell überarbeiten. Ich habe seltsame Probleme mit Skripten festgestellt, die nach der ersten Methode auf halbem Weg nach dem Zufallsprinzip beendet wurden. Insbesondere scheint es wget für Windows Spaß zu machen, mein Skript nach dem Herunterladen zu beenden. Ich habe die letzten zwei Stunden mit der schmerzhaften Fehlerbehebung meines Skripts verbracht, aber schließlich habe ich versucht, alle Exes in ein einziges Stammverzeichnis zu werfen, und die Probleme sind einfach alle verschwunden. Daher rate ich dringend zur Vorsicht, bevor jemand mit dieser Methode All-In geht.
Cyqsimon
4

Dies ist, was ich benutze, um das Problem zu beheben. Kopieren Sie dieses Skript unten und speichern Sie es FIXPATH.BATin dem Ordner, den Sie der PATHUmgebungsvariablen hinzugefügt haben . Zum Beispiel:

C: \ Users \ myuser \ CMD_Software \

Wenn Sie jetzt ein Programm ausführen müssen, das sich in einem Unterordner befindet, sagen Sie ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
oder
C: \ Users \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Führen Sie fixpathzuerst den Befehl aus grepund geben Sie ihn exiftoolwie folgt ein (z. B. oder ):

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. Alle Rechte vorbehalten.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

für / R %% d in (.) do (
    setze "dirs =! dirs!; %% d"
)

path =% path%! dirs!
(endlokal
    setze "ret =% PATH%"
)
cmd / K "title [#] Path Fixed [#] && path% ret%"
Ausfahrt / B

Danke an @ VonC's Antwort

Vinayak
quelle
1

Legen Sie ein Unterverzeichnis "programlinks \" unter ... \ CMD_Software (oder irgendwo anders) ab und füllen Sie es mit symbolischen Links oder Hardlinks zu jeder ausführbaren Datei, auf die Sie zugreifen möchten. Dann genügt ein Eintrag im PATH for ... \ programlinks.

kreemoweet
quelle
1
Das Hauptproblem dabei ist, dass Bibliotheken, von denen die ausführbare Datei abhängt, die sich möglicherweise im selben Verzeichnis wie die exe befinden, nicht verwendet werden. Oder zumindest passiert das mit meinem Versuch damit.
Zero298,
Tolle Bemerkung, @ zero298. Obwohl ich möchte, wenn jemand zu 100% sicher ist und bestätigen kann, dass dies tatsächlich zutrifft, bitte einschalten. (Weil diese Methode ansonsten die absolut sauberste von allen ist.)
Henrik
-1

Wenn Ihnen die Idee nicht allzu abschreckt, können Sie Ihre Befehlszeilentools in das Verzeichnis Windows \ System32 kopieren. Dann können Sie sie von jedem beliebigen Verzeichnis aus ausführen, genau wie ping oder ipconfig.

edit
Nach einigem Herumbasteln ist dies möglich. Sie müssen nur Semikolons verwenden, um Ihre Verzeichnisse abzugrenzen. Angenommen, Sie hatten ein Programm in "folder1" und "folder2". Du würdest deinen Weg so schreiben:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Dann können Sie ein Programm in einem der Verzeichnisse direkt über die Befehlszeile aufrufen. AFAIK, es gibt keinen anderen Weg, dies mit nur einer einzigen Zeile zu tun.

Hintergrundinformationen: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
quelle
1
Das ergibt wenig Sinn. 1. Dies würde jeglichen vorherigen Inhalt der PATH-Variablen löschen . 2. Die PATH-Variable enthält nur den Ordner und nicht dessen Unterverzeichnisse (gewünschtes Ergebnis). 3. Das Aufrufen von program.batas %PATH%\program.batist mehr oder weniger das Gegenteil von dem, wofür PATH entwickelt wurde.
Dennis