web-dev-qa-db-ja.com

WindowsでPATH環境変数の過剰な入力を回避するにはどうすればよいですか?

システム内の実行可能ファイルを管理するために使用するアプローチを教えてください。たとえば、コマンドラインからほとんどすべてにアクセスできますが、パス文字列の制限に達しているため、これ以上ディレクトリを追加できません。

それで、あなたは何をお勧めしますか?ずっと前に、パスに属するDir内の実行可能ファイルのソフトリンクを使用しようとしましたが、そのアプローチは機能しませんでした。既知のDirに「実行可能ファイルのみ」を投げると、ほとんどすべてのアプリケーションが一連のファイルを必要とするという問題があるため、これも悪いことです。実行可能ファイルとすべてのファイルを既知のDirに投げます。これは機能しますが、ファイル名の競合が発生する可能性は非常に高くなります。 HardLinkを作成しますか?知りません。どう思いますか?

112
mjsr

私が考えることができる1つの方法は、他の環境変数を使用して部分パスを保存することです。たとえば、あなたが持っている場合

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

次に、次のような新しい環境変数を作成できます

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

その後、元のパスは

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

EDIT:別のオプションは、適切な.batファイルを指す.exeファイルを保持するbinディレクトリを作成することです。

編集2:別の回答に対するBen Voigtのコメントは、提案された他の環境変数を使用しても、%PATH%は保存される前に展開されるため、長さを短縮しないかもしれないと述べています。これは真実かもしれず、私はそれをテストしていません。ただし、別のオプションは、より長いディレクトリ名に8dot3フォームを使用することです。たとえば、C:\Program Filesは通常C:\PROGRA~1と同等です。 dir /xを使用して、短い名前を表示できます。

編集3:この簡単なテストは、Ben Voigtが正しいと思うように導きます。

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

この最後に、hellohelloではなくbyehelloという出力が表示されます。

編集4:バッチファイルを使用して%PATH%から特定のパスを削除することにした場合、プロセスが次のようにバッチファイルから実行可能ファイルに引数を渡す方法が心配になる場合があります。透過的です(つまり、バッチファイルの呼び出しと実行可能ファイルの呼び出しに違いはありません)。バッチファイルの作成経験はあまりありませんが、これはうまくいくようです。

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

原則として、インターネットからのバッチファイルの実行には注意する必要があります。ハードドライブのフォーマットなど、バッチファイルを使用してあらゆる種類の処理を実行できます。上記のコード(私が書いた)を信頼できない場合は、次の行を置き換えることでテストできます。

%actualdir%\%actualfile% %args%

echo %actualdir%\%actualfile% %args%

理想的には、実行する前にすべての行が何をするかを正確に知っている必要があります。

82
Mitch Schwartz

これにより、%PATH%環境変数が解析され、各ディレクトリがそれに対応する短縮名に変換され、すべてが結合されます。

@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!

出力を取得し、環境変数のPATH変数を更新します。

79
Todd Smith

windows Vista以降を使用している場合は、フォルダーへのシンボリックリンクを作成できます。例えば:

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

c:\pfprogram filesフォルダーになるようにリンクを作成します。このトリックを使用して、パスから300文字を削除しました。

28
bmg002

誰かが興味がある場合...

一度にすべてのパスが実際に必要になることはないので、それに応じてパスを変更する一連の「初期化」バッチファイルを作成します。

たとえば、EclipseでC++開発を行いたい場合、次のようにします。

> initmingw
> initeclipse
> Eclipse

これは、同じ名前の実行可能ファイル(両方ともmake.exeを持つC++およびDコンパイラなど)間の競合を回避するのにも便利です。

私のバッチファイルは通常、次のようになります。

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

このアプローチは比較的きれいで、まだ問題に遭遇していません。

10
YellPika

私は通常、これについて心配する必要はありません(パスサイズの制限に直面していません-現代のWindowsシステムでそれが何であるかさえ知りません)。パス:

  • ほとんどのコマンドラインユーティリティは、パス上にあるc:\utilディレクトリにスローされます
  • そうでない場合は、次のような単純なcmd/batchファイルをc:\utilディレクトリに追加します。

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

これは基本的にコマンドのエイリアスを作成します。必ずしも完璧ではありません。一部のプログラムは実際にパスにいることを主張します(最近では非常にまれです)。しかし、ほとんどの用途ではうまく機能します。

しかし、一般的に、パスにディレクトリを追加することを避けることを心配する必要はありません。

6
Michael Burr

別のアイデア:DIR/Xを使用して、8dot3以外のファイル名に対して生成される短縮名を決定します。次に、これらを%PATH%で使用します。

たとえば、「C:\ Program Files」は「C:\ PROGRA〜1」になります。

5
Android Eve

アプリケーション固有のパスのパス変数の代わりに、App Pathレジストリキーを使用します。

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

5
Mad Hatter

私は標準ストリーム(stdin/stderr/stdout)と終了コードPROXYプログラム(ディスパッチャーと呼ばれる https://github.com/131/dispatcher )を毎回作成して使用しています。

私が使用しているすべてのCLIプログラム(ノード、php、python、git、svn、rsync、plink ...)実際に使用しているのは同じexeファイル(約10kb、名前が違うだけです)、同じディレクトリ。ダミーの静的なクリアテキストファイルは、「プロキシファイル名から実際のexeへのマッピング」を行います。

Dispatcherは、低レベルのプロセス管理win32 APIを使用して、完全に透過的にします。

このソフトウェアを使用すると、使用する可能性のあるすべてのプログラムに対して、PATHに1つの追加ディレクトリのみが設定されます。

1
131

フォルダーc:\ binを作成してパスに追加し、前述のようにハードリンクすると、文字列が短くなる可能性があります。変数pfを値c:\ Program Filesのシステム変数に追加してから、c:\ Program Filesをパスの%pf%に置き換えます。

編集:

仮想ドライブを作成します。 subst p: "c:\ program files"

1
troynt

上記のソリューションは、パスを縮小できる場合にのみ機能します。私の場合、これは実際にはオプションではなく、コマンドプロンプトを開くたびにスクリプトを実行しなければならないのは面倒でした。そのため、コマンドプロンプトを開くと自動的に実行され、テキストファイルの内容をパスに追加する簡単なスクリプトを作成しました。

また、このスクリプトを実行すると問題が発生するコンテキストもあります(たとえば、githubまたはcygwin Shellで)。そのため、コマンドプロンプトが起動されるとパス変数isnであるパスのリストを含むファイルも追加しました。通常はパスを更新する起動スクリプトを介して変更されません。

@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

Path.txtは次のようになります

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;

Dontsetup.txtは次のようになります

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

起動時にこれを自動的に実行するには、regeditを開き、HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Command Processorに移動し、右を右クリックして、[新規]-> [複数行文字列値]を押します。 AutoRunという名前を付けます。値を設定します

C:\Users\Yams\setUpPath.bat

または、上記のバッチファイルを保存した他の場所。

0
Phylliida

試しませんでしたが、PATHをパーツに分割し、それらを最終的な可変機能に結合しますか?

例では、最初に次のようなものがあるとしましょう

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

代わりに作成します:

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

次の手順に従って、エントリを管理しやすくします。

  1. ソフトウェアパッケージの使用のさまざまな組み合わせに対して、さまざまなユーザーを作成しました。例:(a)すべてのWeb開発ソフトウェアを利用可能にするためのユーザーWebを作成しました。 (b)すべてのデータベースおよびデータウェアハウジングソフトウェアパッケージを利用可能にするためのユーザーデータベースを作成しました。一部のソフトウェアでは、複数のエントリが作成される場合があることに注意してください。または、これをOracle固有のユーザー、MSSQL固有のユーザー、およびOracle固有のユーザーに分割することもあります。 MySQL/PostgreSQL、Tomcat、wamp、xampをすべてユーザーアカウントwebrに入れました。

  2. 可能であれば、office、photoshopなどの一般的なパッケージを、すべてのユーザーが利用できるシステム固有のものとしてインストールし、特別なパッケージをユーザー固有のものとしてインストールします。もちろん、異なるユーザーにログインしてインストールする必要がありました。すべてのソフトウェアがこのオプションを提供するわけではありません。 「このユーザーのみにインストール」オプションが使用できない場合は、システム全体にインストールします。

  3. Program File(x86)フォルダまたはProgram Fileにプログラムをインストールすることは避けます。常にベースディレクトリにインストールします。たとえば、MySQL 64ビットは「C:\ mysql64」に入り、MySQL 32ビットは「C:\ mysql」フォルダーに入ります。私は常に、64ビットソフトウェアにのみサフィックス64を追加することを想定しています。接尾辞がない場合は、32ビットです。 Javaなどにも同じことをします。これにより、「C:\ Program File(x86)」を含まずに、パスが短くなります。一部のソフトウェアでは、構成ファイルを編集して、.exeファイルの場所を正確に示す必要がある場合があります。 「C:\ Program File(x86)」にインストールする必要があるプログラムのみがそのフォルダーにインストールされます。名前を短くすることを常に覚えています。 Tomcat/release/version-2.5.0.3などの詳細なバージョン番号は避けます。バージョンを知る必要がある場合は、バージョン名でファイルを作成し、Tomcatフォルダーに配置します。一般に、リンクをできるだけ短くします。

  4. 上記のすべての手順がWindowsの制限を超えている場合は、パスへの短縮リンクを置き換えるバッチを含めます。

次に、特定の用途(モバイルアプリケーション、またはデータベース/データウェアハウジングまたはWeb開発...)ユーザーにログインし、関連タスクを実行します。

ウィンドウ内に仮想ウィンドウを作成することもできます。ライセンスされたOSコピーが1つある限り、同じキーで複数の仮想ウィンドウを作成できます。特定のタスクに固有のパッケージをそのマシンに配置できます。毎回個別のVMを起動する必要があります。 VMはVMの一部しか使用できないため、3Dアニメーションムービーメーカーなどのメモリ集約型パッケージはすべて、RAMではなくメインマシンに配置する必要があります。その使用のため。ただし、各VMをブートするのは苦痛です。

0
Dr. A. Anukanth