web-dev-qa-db-ja.com

Windows 8のコマンドラインでパスが更新されないのはなぜですか

PATH変数に新しいエントリを追加する必要がありました。これは私の仕事では一般的なアクティビティですが、最近Windows 8を使い始めました。プロセスはWindows 7、Vista、XPと同様であると思いました...

これが私の一連のイベントです:

  1. システムのプロパティを開きます([スタート]-> [コントロールパネルのタイプ]->コントロールパネル\システムとセキュリティ\システム->システムの詳細設定->環境変数)
  2. USER PATH変数のbeginningに新しいパスを追加(C:\ dev\Java\Apache-ant-1.8.4\bin;)
  3. コマンドプロンプトを開きました(スタート-> [タイプ "コマンドプロンプト"を入力してください]-> [タイプ "パス"を入力してください]

新しいパスエントリが利用できません(添付の画像とビデオを参照)。私はWindows 7マシンでまったく同じプロセスを複製し、それは機能しました。

Screen grab of environment variables

[〜#〜]編集[〜#〜]

Windows 8環境変数とコマンドプロンプトビデオ

[〜#〜]編集[〜#〜]

これは間違いなくWindows 7の動作ではありません。このビデオを見て、動作を確認してくださいWindows 7で動作することを期待していますhttp://youtu.be/95JXY5X0fII

EDIT 5/31/2013

だから、私は苛立ちを覚えた後、WM_SETTINGCHANGEイベントをテストするための小さなC#アプリを書きました。このコードは、Windows 7とWindows 8の両方でイベントを受け取ります。ただし、私のシステムのWindows 8では、正しいパスを取得できません。しかし、私はWindows 7で行います。これは、他のWindows 8システムでは再現できませんでした。

これがC#コードです。

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChangingと同等WM_SETTINGCHANGE

Windows 7で実行されているC#プログラム (イベントが通過し、正しいパスを取得することがわかります)。

Windows 8で実行されているC#プログラム (イベントが通過したが、パスが間違っていることがわかります)。

この問題を引き起こしている私の環境についての何かがあります。ただし、これはWindows 8のバグですか?

EDIT 2014-04-28

これと他のいくつかの問題により、デスクトップでWindows 8を使用しなくなりました。この問題のテストと実験を続ける環境はありません。この問題に対する答えや解決策はまだありません。以下の答えは私たちの問題を解決しませんでした。

21
mawcsco

スタートメニューまたはタスクバーのショートカットからコマンドプロンプトを起動する場合は、次のいずれかを行う必要があります。

  • Explorerを再起動します。それを殺し、それを再起動します。
  • ログアウトして再度ログインします(これにより、Explorerが効果的に再起動されます)。
  • システムを再起動します(これもExplorerを効果的に再起動します)。

ログイン時にシステムによって開始されるExplorerを除いて、環境は親プロセスから継承されるため、環境はすぐには更新されません。これが私のWindows 7システムでの動作です。

したがって、環境変数を変更するとレジストリキーが更新されますが、これらのキーは、システムが起動中のプロセスに対して新しいログイン環境を構築する必要があるまで再読み取りされません。ほとんどの場合、プロセスはすでに環境があるプロセスの子であるため、これは発生しません。したがって、環境が継承されます。

7
Darth Android

From: http://support.Microsoft.com/kb/104011 via https://serverfault.com/q/8855/158027

...

ただし、環境変数を変更してもすぐには変更されないことに注意してください。たとえば、変更を加えた後に別のコマンドプロンプトを起動すると、環境変数には以前の(現在ではない)値が反映されます。変更は、ログオフしてから再度ログオンするまで有効になりません。

ログオフせずにこれらの変更を有効にするには、システム内のすべてのウィンドウにWM_SETTINGCHANGEメッセージをブロードキャストして、関係するアプリケーション(Windowsエクスプローラー、プログラムマネージャー、タスクマネージャー、コントロールパネルなど)が更新を実行できるようにします。詳しくは


たとえば、Windows NTベースのシステムでは、次のコードフラグメントは、コマンドプロンプトで使用される環境変数への変更を伝達する必要があります。

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Windowsエクスプローラーやプログラムマネージャーなど、Windows 95およびWindows 98に同梱されているアプリケーションは、このメッセージに応答しません。したがって、この記事は技術的にWindows 95およびWindows 98に実装できますが、サードパーティのアプリケーションに通知する以外の効果はありません。 Windows 95でグローバル環境変数を変更する唯一の方法は、autoexec.batファイルを変更して再起動することです。

3
Enigma

問題はユーザー設定にあります。ウィンドウ8では、各ユーザーが独自の環境変数を持っています。

システムプロパティを開きます([スタート]-> [コントロールパネルのタイプ]->コントロールパネル\システムとセキュリティ\システム->システムの詳細設定->環境変数)

上記のアプローチは、おそらく現在のユーザーではなく、rootユーザーの環境変数を編集します。

あなたはユーザーアカウントに行く必要があります->現在のアカウントを選択します->環境変数を変更します

変更後、Power Shellを再起動します。その後

echo $env:Java_HOME

または

Get-ChildItem env

これがお役に立てば幸いです。

1
Vu Gia Truong

彼に遅い。しかしながら。この問題の被害者である可能性があります: Windowsではユーザー変数が正しく解決されません

0
elder elder

SETの代わりにSETXを試してください。例:SETX PATH "%PATH%;MyPath"

0
kct

Windows 8.1を使用している場合は、管理者としてコマンドプロンプトを開き、PATHコマンドを呼び出すと、そこに表示されます。通常のcmdに戻ると、それも表示されます。実際のところ、追加したアプリケーションはコマンドプロンプトから起動できるはずです。

0
viktorkh