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


21

PATH変数に新しいエントリを追加する必要がありました。これは仕事でよくあることですが、最近Windows 8を使い始めました。プロセスはWindows 7、Vista、XPに似ていると思いました...

イベントのシーケンスは次のとおりです。

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

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

環境変数のスクリーングラブ

編集

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

編集

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

編集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のバグですか?

編集2014-04-28

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


2
変更を有効にするには、変更を行った後に再起動する必要があると思います。
エニグマ

@エニグマなんで?Windows 7、Vista、XP、2000で再起動する必要はありませんでした
-mawcsco

@mawcsco少なくとも7でやりました。スタートメニューからコマンドプロンプトを開くと、ログイン時に読み込まれたエクスプローラシェルの環境で起動します。エクスプローラを強制終了/再起動するか、ログアウトまたはログアウトするか、システムを再起動する必要があります。
ダースAndroid

1
@Enigma再起動は必要ありません。serverfault.com/questions/8855/...
mawcsco

1
Windows 7とWindows 8の両方でこれを確認しました。どちらの場合もcmd、新しいインスタンスが起動されたときに新しい環境変数が表示されていました。もちろん、すでに実行cmdされている環境は更新された環境を取得していません。
アレクセイイワノフ

回答:


7

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

  • 再起動しexplorerます。強制終了して再起動します。
  • ログアウトしてからログインし直します(これにより効果的に再起動しますexplorer)。
  • システムを再起動します(これも効果的に再起動しますexplorer)。

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

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


2
Windows 7の場合はまったく誤りです。上記の投稿でリンクしたビデオを参照してください。
mawcsco

1
ほら 間違いなくそこに間違いはありませんが、私の変更は、Win 7の新しいコンソールウィンドウにすぐには適用されませんでした。ただし、正確なワークフローが何であったかは思い出せません。それまでに誰もあなたに答えをもらえない場合、家に帰ったときにWin 8システムをいじります。
ダースAndroid

5
[システムのプロパティ]ダイアログを使用して環境変数を変更した場合、変更は現在実行中のExplorerインスタンスにすぐに適用され、その後開始されたすべてのプロセスは新しい環境を取得します。既に実行中のプロセスは、WM_SETTINGCHANGEメッセージを処理しない限り、環境変数を自動的に更新しません。
アレクセイイワノフ

1
おい、これはとにかく私が抱えていた問題を理解するのに役立ちました。AutoHotkeyを使用してコマンドプロンプトを起動しましたが、autohotkeyを再起動するまで機能しませんでした。
モス

1
@mawcscoそれは私のために働いた、私はWindows 7を使用しています。
laike9m15年

3

From:http : //support.microsoft.com/kb/104011 /server//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ファイルを変更して再起動することです。


2
Windows 7のエクスプローラーはこのメッセージを処理し、タスクバーまたは[スタート]メニューからコマンドプロンプトを再起動するだけで十分です。
アレクセイイワノフ

「環境変数の変更は、対象のコンピューターのメインの[プロパティ]ダイアログで変更を行うとすぐに有効になります([マイコンピューター] | [プロパティ] | [詳細] | [環境変数]に移動します)。すべてのウィンドウに変更を通知します。」serverfault.com/questions/8855/...
mawcsco

2
「システムのヒントは、この記事では、使用しているものとは異なるバージョンのWindowsに適用されます。この記事の内容は、あなたに適切ではないかもしれませんログインのWindows 8ソリューションセンター。。」
mawcsco

これが実装の詳細であり、MicrosoftがWindows 8以降でこの動作をサポートする意図を持っていなかったことは驚くことではありません。
surfasb

1

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

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

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

ユーザーアカウントに移動し、現在のアカウントを選択して、環境変数を変更します。

変更後、電源シェルを再起動します。それから

echo $env:JAVA_HOME

または

Get-ChildItem env

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


「mwillia3のユーザー変数」とのダイアログを示すスクリーンショットとビデオの詳細を見逃していると思います。それが私のユーザー名です。正しい環境変数を編集していたことは確かです。C#アプリは、更新された値ではなく、古い値でイベントを発生させます。私はあきらめた。これはWin 8のバグであると確信しており、これをテストするためにWindows 8にアクセスできなくなりました。
mawcsco

一部の人々は常に詳細を読むとは限りません。これは一部のシステムでは見られますが、他のシステムでは見られません。Windows7/2008でも見られます。私が見つけたそれが起こるときの韻や理由はありません。
ferventcoder

WM_SETTINGSCHANGEDを​​伝播した後でも、Windows Server 2012 r2で同じ問題が発生します。Windowsのバグだと思います。
ヴェゼンコフ

0

SETではなくSETXを試してください。例えばSETX PATH "%PATH%;MyPath"


1
なぜ機能するの SETXではなく、理由を説明できますSET
ChrisF

まず、コマンドラインを使用していませんでした。システムダイアログを使用していました。第二に、Windows 7では動作パターンは正常に動作しますが、Windows 8では動作しない場合があります。Windows7とWindows 8の間でSETとSETXがどのように変化したかを示すドキュメントを参照できますか?
mawcsco

0

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



-1

デスクトップからWin + Rを使用してcmd.exeを起動すると機能しますか?スタート画面から起動すると、起動されたcmd.exeの親がexplorer.exe(WSAHost.exe、IIRC、または名前が付けられたもの)とは異なるため、親プロセスはWM_SETTINGCHANGEメッセージ中に環境を更新しません。テストするためのWindows 8マシンは手元にありません...


Windows 8でも、explorer.exeが強制終了されると消えるので、Start Screen UIはすべてexplorer.exeの一部のようです。
ビンキ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.