web-dev-qa-db-ja.com

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

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

フォローアップ
%ProgramFiles%変数がPATH環境変数で使用されている場合、where.exeはOpenSSLライブラリを検出しません

14
Piotr Dobrogost

%ProgramFiles%から%ProgramFiles(x86)%への環境変数の切り替えが機能するようにします。

X32およびx64バージョンのOpenSSLライブラリを含むフォルダーを適切な%programfiles%および%ProgramFiles(x86)%ディレクトリに配置し、PATH環境変数で、%programfiles%変数を介してこれらのフォルダーへの参照を使用します。

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

9
romka

Romkaによって提供された答え(正しいチェック)はシンプルでエレガントですが、残念ながら機能しません(少なくともWindows 7およびWindows 8 64ビットでは、テストをさらにプッシュしませんでした)。

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

私が見つけた唯一の解決策は、コメントで提案されているように、 File System Redirector マジックとディレクトリSystem32/SysWoW64を使用することです。

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

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

7

はい、それは絶対に可能です。 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ファイルは、名前が異なることを除いて、基本的に同じです。 1つ目は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 | 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
5
Darokthar

Baptiste Chardonの answer で提供されているリンクをたどって得た回答を要約したいと思いました。 mklinkコマンドラインツールを使用して、C:\Windows\system32およびにディレクトリシンボリックリンクを作成し、C:\Windows\SysWOW64にそれぞれが同じ名前(ターゲットは異なります)を持っている場合は、C:\Windows\system32の1つを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
1
user74094

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

64ビットマシンでのシステム変数のパスはc:\progra~2です。環境変数のスペースのないパスが必要です。それ以外の場合、システムはC:\programsより先に読み取れません。

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

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

0
JRubinstein