32ビットと64ビットのWindowsで異なるPATH環境変数-可能ですか?


14

PATH実行中のプロセスのイメージのタイプ(32ビット/ 64ビット)に固有の環境変数の全体または一部を持つことは可能ですか?64ビットcmd.exe内からアプリを実行するときは、64ビットバージョンのOpenSSLライブラリを選択したいのに対し、32ビットcmd.exe内からアプリを実行するときは、32ビットバージョンのOpenSSLライブラリを選択します。

FOLLOW UP
%のPROGRAMFILES%変数は、PATH環境変数で使用されたときのOpenSSLのlibsを見つけることができませんwhere.exe

回答:


9

作る%ProgramFiles%ために%ProgramFiles(x86)%あなたのための作業に変数の切り替えをENV:

OpenSSLライブラリのX32およびx64バージョンとの場所のフォルダ適切に%programfiles%し、%ProgramFiles(x86)%ディレクトリとでPATH環境変数は、経由してこれらのフォルダへの参照を使用する%programfiles%変数。

このように、x32ビット環境で実行している場合、PATHエントリ%programfiles%/OpenSSL/%ProgramFiles(x86)%/OpenSSL/ディスク上で自動的に解決さ れます。


1
まあ私はそれを動作させるためにいくつかの問題を抱えています。echo %programfiles%実行元のcmd.exeのタイプに応じて異なるパスを表示しwhere ssleay32.dllますが、cmd.exeの両方のタイプ(32ビットと64ビット)でこのdllが見つからず、INFO: Could not find files for the given pattern(s).アイデアが表示されますか?
ピョートルドブロゴスト

これは役立つかもしれませんが、これは役立つかもしれません:stackoverflow.com/questions/906310/…–
ダロクタル

1
DLLのいずれかが64ビットマシンで、32ビットのものであれば、それはCに入る必要があります:\ WINDOWS \ SYSWOW64フォルダ
romka

これは私には機能しません。PATH変数の定義に%ProgramFiles%を含めると、まったく展開されないため、exeがそのdllを見つけられません。
カルロスA.イバラ

7

romkaが提供する回答(右にチェック)はシンプルでエレガントですが、残念ながら機能しません(少なくともWindows 7およびWindows 8 64ビットでは、テストをさらに進めませんでした)。

問題は、システムの%PATH%変数が他のenv変数を常に展開するわけではないという事実に起因しています。たとえば、%SYSTEMDRIVE%で機能しますが、残念ながら%PROGRAMFILES%では機能しません。ウィキペディアでは、この動作は間接性のレベルに起因することを示唆しています(%SYSTEMDRIVE%は3番目のenv変数を参照しません)。

私が見つけた唯一の解決策は、コメントで提案されているように、ファイルシステムリダイレクタマジックとディレクトリSystem32 / SysWoW64 を使用することです。

通常、メンテナンスが困難なWindowsディレクトリへのDLLの直接展開を回避するために、代わりにカスタムディレクトリへのソフトリンクを展開できます(Windows Vista以降のバージョンのWindowsで動作します)。

  • ここにあるメソッド:http : //realfiction.net/go/153
  • ここでソフトリンクを作成する方法:http ://www.howtogeek.com/howto/windows-vista/using-symlinks-in-windows-vista/

ちなみに、関連する投稿に直接コメントしないで申し訳ありません。現在、これを行うにはアカウントの評判が十分ではありません。


5

はい、絶対に可能です。3つの.batファイルを記述するだけです。最初のものは次のようになります。

@echo off
if "%1" == "" goto x86
if not "%2" == "" goto usage

if /i %1 == x86 goto x86
if /i %1 == ia64 goto ia64
goto usage

:x86
if not exist "%~dp0bin\x86.bat" goto missing
call "%~dp0bin\x86.bat"
goto :eof

:ia64
if not exist "%~dp0bin\ia64.bat" goto missing
call "%~dp0bin\ia64.bat"
goto :eof

:usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo where [option] is: x86 ^| ia64
echo:
echo For example:
echo %0 x86
goto :eof

:missing
echo The specified configuration type is missing. The tools for the
echo configuration might not be installed.
goto :eof

2番目と3番目の.batファイルは、名前が異なる以外は基本的に同じです。最初はx86.bat、2番目はia64.batと呼ばれ、最初のbatファイルの上にあるbinというフォルダーに配置されます。これがあります:

PATH\first.bat
PATH\bin\x86.bat
PATH\bin\ia64.bat

2番目と3番目の.batファイルの内容は次のようになります。

@set PATH=THE PATH YOU WANT

次の設定を持つ最初の.batファイルへのリンクを作成できます。

ターゲット:%comspec%/ k "PATH \ first.bat"オプション| OPTIONがx86またはia64の場合

開始:PATH | PATHは、first.batへのパスです

このスクリプトは、MicrosoftがVisual Studio環境に適したコマンドラインを起動するために使用する簡略化されたスクリプトです。このスクリプトをN環境に単純に拡張できます。さまざまな環境用に.batファイルを追加し、より多くのオプションとgotoステートメントでfirst.batを編集します。それが自己説明的であることを願っています。

そして、マイクロソフトが彼らのスクリプトを使用したとして私を訴えないことを願っています。

編集:

ああ、私はあなたを少し誤解したと思う。32ビットcmd行の場合、リンクは次のように作成する必要があります。

ターゲット:%windir%\ SysWoW64 \ cmd.exe "PATH \ first.bat" x86

EDIT2:

次のようなものを試してください:

if "%ProgramFiles%" == "%ProgramFiles(x86)%" goto x64_PATH
if "%ProgramFiles%" == "%ProgramW6432%" goto x86_PATH

:x64_PATH
@set PATH=YOUR 64 bit PATH
SOME_PATH\your64BitApp.exe
goto :eof

:x86_PATH
@set PATH=YOUR 32bit PATH
SOME_PATH\your32BitApp.exe
goto :eof

1
わかりやすくするために、修正することをお勧めします-可能性としては、Intel 64ビットテクノロジー(ia64-Itanium CPU)ではなく、一般にx64と呼ばれるAMD64ビットテクノロジーを使用しています。
マルチバースIT

ご回答有難うございます。アイデアはいいです。ただし、%ProgramFiles%変数の変更に使用されるようなシステムレベルのソリューションを探していました。(引用:%ProgramFiles%自体は、環境変数を要求するプロセス自体が32ビットか64ビットかによって異なります(これはWindows-on-Windows 64ビットリダイレクトが原因です)。en.wikipedia.org/wiki/ …
ピョートルドブロゴスト

1

Baptiste Chardonからの回答に記載されているリンクをたどって得られた回答を要約したかっただけです。使用してmklinkいるディレクトリのシンボリックリンクを作成するためのコマンドラインツールC:\Windows\system32 ではC:\Windows\SysWOW64、それぞれが(異なるターゲットが)同じ名前を持つ、あなたはその後だけに1を追加することができますC:\Windows\system32するPath環境変数。例えば:

C:\> mklink /D C:\Windows\SysWOW64\my_XXbit_dlls C:\dlls\x86
symbolic link created for C:\Windows\SysWOW64\my_XXbit_dlls <<===>> C:\dlls\x86
C:\> mklink /D C:\Windows\System32\my_XXbit_dlls C:\dlls\x64
symbolic link created for C:\Windows\System32\my_XXbit_dlls <<===>> C:\dlls\x64

0

私はこの問題を抱えており、答えは次のとおりです。

64ビットマシンのシステム変数のパスはc:\progra~2です。環境変数のスペースのないパスが必要です。そうしないと、システムはを超えて読み取りませんC:\programs

32ビットマシンでは環境変数companyprogramsがc:\program files、64ビットマシンではその変数ですc:\progra~2。次に、ユーザーのショートカットを設定します%companyprograms%\...

グループポリシーまたはスクリプトを使用して実行できます。


-1

フォローアップでromkaが示したように、簡単な答えはSysWOW64ディレクトリです。

幸いなことに、Shining Lightプロダクションのインストーラーがこれを処理してくれます。32ビットと64ビットのインストーラーを実行し、.DLLをWindow "System"ディレクトリにコピーすることを選択すると、適切なディレクトリが.DLLに選択されます(つまり、64ビット.DLLはSystem32に、32ビット.DLLはSysWOW64に移動します。

これを行うと、32ビットアプリは32ビット.DLLを見つけ、64ビットアプリは64ビット.DLLを見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.