it-swarm.com.de

Wie vermeiden Sie, die PATH-Umgebungsvariable in Windows zu überfüllen?

Ich würde gerne wissen, mit welchen Ansätzen Sie die ausführbaren Dateien in Ihrem System verwalten. Zum Beispiel habe ich fast alles über die Befehlszeile zugänglich, aber jetzt komme ich an die Grenze der Pfadzeichenfolge, so dass ich kein weiteres Verzeichnis hinzufügen kann.

Was empfehlen Sie also? Vor langer Zeit habe ich versucht, SoftLinks der ausführbaren Dateien in einem Dir zu verwenden, die zu dem Pfad gehörten, aber dieser Ansatz hat nicht funktioniert . Wirft die "nur ausführbare Datei" auf Bekannte Dir, hat die Probleme, dass für fast jede Anwendung ein Satz von Dateien erforderlich ist, daher ist dies auch schlecht . Die ausführbare Datei und alle seine Dateien in eine bekannte Dir, mmm wird dies funktionieren, aber die Möglichkeit, einen Konflikt zu bekommen Der Name der Dateien ist sehr hoch. Erstellen Sie einen HardLink? ich weiß es nicht. Was denkst du?

106
mjsr

Eine Möglichkeit, die ich mir vorstellen kann, ist die Verwendung anderer Umgebungsvariablen zum Speichern von Teilpfaden. Zum Beispiel, wenn Sie haben

C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;

dann können Sie eine neue Umgebungsvariable wie erstellen

SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places

danach werden deine ursprünglichen Pfade

%P1%\subdir1;
%P1%\subdir2;

EDIT: Eine andere Option ist das Erstellen eines bin-Verzeichnisses, das .bat-Dateien enthält, die auf die entsprechenden .exe-Dateien zeigen.

EDIT 2: Ben Voigts Kommentar zu einer anderen Antwort erwähnt, dass die Verwendung anderer Umgebungsvariablen die Länge von %PATH% möglicherweise nicht verkürzt, da sie vor der Speicherung erweitert werden. Das mag wahr sein und ich habe es nicht getestet. Eine andere Option ist jedoch die Verwendung von 8dot3-Formularen für längere Verzeichnisnamen. Beispielsweise entspricht C:\Program FilesC:\PROGRA~1. Sie können dir /x verwenden, um die kürzeren Namen anzuzeigen.

EDIT 3: Dieser einfache Test lässt mich glauben, dass Ben Voigt recht hat.

set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%

Am Ende sehen Sie die Ausgabe hellohello und nicht byehello.

EDIT 4: Falls Sie sich entscheiden, Batchdateien zu verwenden, um bestimmte Pfade aus %PATH% zu entfernen, machen Sie sich möglicherweise Gedanken darüber, wie Sie Argumente von Ihrer Batchdatei an Ihre ausführbare Datei übergeben, sodass der Prozess transparent ist (dh, Sie haben gewonnen Kein Unterschied zwischen dem Aufruf der Batchdatei und dem Aufruf der ausführbaren Datei. Ich habe nicht viel Erfahrung beim Schreiben von Batch-Dateien, aber das scheint gut zu funktionieren.

@echo off

rem This batch file points to an executable of the same name
rem that is located in another directory. Specify the directory
rem here:

set actualdir=c:\this_is\an_example_path

rem You do not need to change anything that follows.

set actualfile=%0
set args=%1
:beginloop
if "%1" == "" goto endloop
shift
set args=%args% %1
goto beginloop
:endloop
%actualdir%\%actualfile% %args%

Im Allgemeinen sollten Sie beim Ausführen von Stapeldateien aus dem Internet vorsichtig sein, da Sie mit Stapeldateien, z. B. der Formatierung Ihrer Festplatte, alle möglichen Dinge tun können. Wenn Sie dem obigen Code nicht trauen (den ich geschrieben habe), können Sie ihn testen, indem Sie die Zeile ersetzen

%actualdir%\%actualfile% %args%

mit

echo %actualdir%\%actualfile% %args%

Idealerweise sollten Sie genau wissen, was jede Zeile macht, bevor Sie sie ausführen.

81
Mitch Schwartz

Dadurch wird Ihre Umgebungsvariable% PATH% analysiert, und jedes Verzeichnis wird in den entsprechenden Kurznamen umgewandelt und anschließend wieder zusammengesetzt:

@echo off

SET MyPath=%PATH%
echo %MyPath%
echo --

setlocal EnableDelayedExpansion

SET TempPath="%MyPath:;=";"%"
SET var=
FOR %%a IN (%TempPath%) DO (
    IF exist %%~sa (
        SET "var=!var!;%%~sa"
    ) ELSE (
        echo %%a does not exist
    )
)

echo --
echo !var:~1!

Nehmen Sie die Ausgabe und aktualisieren Sie die Variable PATH in Umgebungsvariablen.

77
Todd Smith

wenn Sie Windows Vista oder höher verwenden, können Sie einen symbolischen Link zu dem Ordner erstellen. zum Beispiel:

mklink /d C:\pf "C:\Program Files"

würde einen Link machen, so dass c:\pf Ihr program files-Ordner wäre. Ich habe mit diesem Trick 300 Zeichen von meinem Weg abgeschnitten.

27
bmg002

Falls jemand interessiert ist ...

Ich finde, ich brauche all diese Pfade nie auf einmal, also erstelle ich eine Reihe von "Initialisierungs" -Stapeldateien, die den Pfad entsprechend ändern.

Wenn ich beispielsweise eine C++ - Entwicklung in Eclipse durchführen wollte, würde ich Folgendes tun:

> initmingw
> initeclipse
> Eclipse

Dies ist auch praktisch, um Konflikte zwischen ausführbaren Dateien mit demselben Namen zu vermeiden (z. B. die C++ - und D-Compiler, die beide eine make.exe haben).

Meine Batch-Dateien sehen normalerweise so aus:

@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%

Ich finde diesen Ansatz relativ sauber und habe noch keine Probleme damit.

10
YellPika

Im Allgemeinen muss ich mir keine Sorgen machen (ich habe keine Begrenzung für die Pfadgröße - ich weiß gar nicht, was das auf modernen Windows-Systemen ist), aber ich kann Folgendes tun, um zu vermeiden, dass das Verzeichnis eines Programms eingefügt wird der Weg:

  • die meisten Befehlszeilenprogramme werden in ein c:\util-Verzeichnis geworfen, das sich im Pfad befindet
  • andernfalls füge ich dem c:\util-Verzeichnis eine einfache cmd/batch-Datei hinzu, die etwa so aussieht:

    @"c:\program files\whereever\foo.exe" %*
    

was im Wesentlichen einen Alias ​​für den Befehl erstellt. Es ist nicht unbedingt perfekt. Einige Programme bestehen wirklich darauf, im Pfad zu sein (was heutzutage ziemlich selten ist), und andere Programme, die versuchen, ihn aufzurufen, finden ihn möglicherweise nicht richtig. Aber für die meisten Anwendungen funktioniert es gut.

Im Allgemeinen habe ich mich jedoch nicht darum gekümmert, das Hinzufügen von Verzeichnissen zu dem Pfad zu vermeiden.

6
Michael Burr

Eine andere Idee: Verwenden Sie DIR/X, um die Kurznamen zu ermitteln, die für Nicht-8-DOT3-Dateinamen generiert wurden. Verwenden Sie diese dann in% PATH%.

Beispiel: "C:\Programme" wird zu "C:\PROGRA ~ 1".

5
Android Eve

Verwenden Sie den Registrierungsschlüssel für den Anwendungspfad anstelle der Pfadvariablen für anwendungsspezifische Pfade:

http://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

5
Mad Hatter

Ich habe jedes Mal einen Standard-Stream (stdin/stderr/stdout) geschrieben und verwendet und das PROXY-Programm zum Beenden des Codes (Dispatcher https://github.com/131/dispatcher ) aufgerufen.

Alle CLI-Programme, die ich verwende (node, php, python, git, svn, rsync, plink ...), die ich verwende, sind eigentlich die gleiche exe-Datei (um 10 kb, die ich nur anders benenne), die ich in dasselbe stecke Verzeichnis. Eine statische Dummy-Klartextdatei führt das "Proxy-Dateiname zu realer Exe-Zuordnung" aus.

Der Dispatcher verwendet eine Low-Level-Prozessverwaltungs-Win32-API, um absolut transparent zu sein.

Mit dieser Software habe ich nur ein zusätzliches Verzeichnis in meinem PFAD für alle Programme, die ich verwenden kann.

1
131

Wenn Sie einen Ordner c:\bin erstellen, der zu Ihrem Pfad hinzugefügt wird, können Sie die Zeichenfolge verkürzen. Fügen Sie möglicherweise eine Variable pf zu System-Variablen mit dem Wert c:\Program Files hinzu, und ersetzen Sie c:\Program Files mit% pf% im Pfad.

Bearbeiten:

Erstellen Sie ein virtuelles Laufwerk . Subst p: "c:\program files"

1
troynt

Die oben genannten Lösungen funktionieren nur, wenn Sie Ihren Weg beschneiden können. In meinem Fall war dies keine Option, und es war ein Problem, jedes Mal, wenn ich eine Eingabeaufforderung öffnete, ein Skript auszuführen. Also habe ich ein einfaches Skript geschrieben, das beim Öffnen des Befehls Prompt automatisch ausgeführt wird und den Inhalt einer Textdatei an Ihren Pfad anfügt.

Es gibt auch einige Kontexte, in denen die Ausführung dieses Skripts Probleme verursacht (z. B. in einer Github- oder Cygwin-Shell). Daher habe ich auch eine Datei hinzugefügt, die eine Liste mit Pfaden enthält. Wenn der Befehl Prompt darin gestartet wird, lautet die Pfadvariablen Es wurde nicht über das Startskript geändert, das normalerweise den Pfad aktualisiert.

@echo off

:: Modify these to the actual paths of these two files
set dontSetupFile=C:\Users\Yams\Dontsetup.txt
set pathFile=C:\Users\Yams\Path.txt

:: Retrieve the current path (for determining whether or not we should append to our path)
set curDir=%cd%

:: Be done if the current path is listed in the dontSetupFile
SetLocal EnableDelayedExpansion
for /F "delims=" %%i in (%dontSetupFile%) do (
    if "%%i"=="%curDir%" GOTO AllDone
)



:: Append the pathFile to our current PATH
set pathAppend=
for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i)

set PATH=%PATH%;%pathAppend%


:: The only way to actually modify a command Prompt's path via a batch file is by starting
::   up another command Prompt window. So we will do this, however, if this script is
::   automatically called on startup of any command Prompt window, it will infinately 
::   recurse and bad things will happen.

:: If we already ran, we are done
if "%yams%"=="onion" GOTO AllDone

:: Otherwise, flag that we just ran, and then start up a new command Prompt window
::   with this flag set
set yams=onion

cmd \K set PATH=%PATH%;

:: When that command Prompt exits, it will load back up this command Prompt window, and
::   then the user will need to exit out of this as well. This causes this window to
::   automatically exit once the cmd it just spawned is closed.
exit()

:: Path is set up, we are done!
:AllDone
@echo on

Und Path.txt sieht ungefähr so ​​aus

C:\Program Files (x86)\Google\google_appengine;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;

Während Dontsetup.txt sieht ungefähr so ​​aus

C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit
C:\Program Files (x86)\Git\cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

Um dies beim Start automatisch auszuführen, öffnen Sie regedit, navigieren Sie zu HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Command Processor, klicken Sie mit der rechten Maustaste rechts und drücken Sie Neu -> Multi-String-Wert. Nennen Sie es AutoRun. Setzen Sie den Wert auf 

C:\Users\Yams\setUpPath.bat

oder wo auch immer Sie die Batchdatei oben gespeichert haben. 

0
Phylliida

Haben Sie es nicht ausprobiert, aber wird das Teilen von PATH in Teile funktionieren und sich an letzter variabler Arbeit beteiligen?

Beispiel anfangs nehmen wir an, Sie haben so etwas

PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}

Stattdessen erstellen Sie:

_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char}
_PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N}
rem // may be more parts
PATH = %_PATH1%;%_PATH2%
0
Philipp Munin

Ich folge diesen Schritten, um die Einträge überschaubar zu machen:

  1. Erstellen verschiedener Benutzer für unterschiedliche Kombinationen von Softwarepaketen. Beispiel: (a) Erstellen eines Benutzer-Web zur Bereitstellung aller Web-Entwicklungssoftware; (b) Erstellung einer Benutzerdatenbank zur Bereitstellung aller Datenbank- und Data Warehousing-Softwarepakete. Denken Sie daran, dass manche Software mehr als einen Eintrag erstellt. Oder ich baue das mal in Oracle-spezifische und MSSQL-spezifische und Oracle-spezifische Benutzer auf. Ich habe MySQL/PostgreSQL, Tomcat, wamp, xamp all in das Benutzerkonto webr eingetragen.

  2. Installieren Sie nach Möglichkeit gängige Pakete wie Office, Photoshop, .. als systemspezifisch für alle Benutzer und spezielle Pakete als benutzerspezifisch. Natürlich musste ich mich bei verschiedenen Benutzern anmelden und installieren. Möglicherweise bietet nicht jede Software diese Option. Wenn die Option "Nur für diesen Benutzer installieren" nicht verfügbar ist, installieren Sie sie für das gesamte System.

  3. Ich vermeide es, Programme in den Ordner Program File (x86) oder in Program File zu installieren. Ich installiere immer in das Basisverzeichnis. Beispielsweise geht MySQL 64-Bit in "C:\mysql64" und MySQL 32-Bit in "C:\mysql". Ich gehe immer davon aus, nur für 64-Bit-Software ein Suffix 64 hinzuzufügen. Wenn kein Suffix, dann ist es ein 32-Bit. Ich verfolge das gleiche mit Java und anderen. Auf diese Weise wird mein Pfad kürzer sein und "C:\Program File (x86)" nicht enthalten. Für einige Software muss die Konfigurationsdatei möglicherweise bearbeitet werden, um anzuzeigen, wo genau sich die EXE-Datei befindet. In diesem Ordner wird nur ein Programm installiert, das in "C:\Program File (x86)" installiert werden muss. Ich erinnere mich immer daran, die Namen zu kürzen. Ich vermeide solche Versionsnummern wie Tomcat/Release/Version-2.5.0.3. Wenn ich die Know-Version brauche, erstelle ich eine Datei nach Namen und stelle sie in den Tomcat-Ordner. Verkürzen Sie den Link im Allgemeinen so gut wie möglich.

  4. Fügen Sie einen beliebigen Stapel hinzu, um den abgekürzten Link zum Pfad zu ersetzen, wenn alle oben genannten Schritte den Windows-Grenzwert überschritten haben.

Melden Sie sich dann bei einem anwendungsspezifischen Benutzer (mobile Anwendung oder Datenbank/Data Warehousing oder Web-Entwicklung .. ..) an und erledigen Sie die entsprechenden Aufgaben.

Sie können auch virtuelle Fenster innerhalb von Fenstern erstellen. Wenn Sie über eine lizenzierte Betriebssystemkopie verfügen, können Sie mehrere virtuelle Fenster mit demselben Schlüssel erstellen. Sie können Pakete, die für eine bestimmte Aufgabe spezifisch sind, auf diesem Computer ablegen. Sie müssen jedes Mal ein separates VM starten. Einige speicherintensive Pakete wie 3D-Animationsfilmproduzenten sollten auf dem Hauptcomputer abgelegt werden, nicht auf VM, da VM nur einen Teil des RAM zur Verfügung hat. Es ist jedoch schmerzhaft, jeden VM zu booten.

0
Dr. A. Anukanth