2

Windows 7 で環境変数を変更する機能がありません。ただし、レジストリ設定を変更する権限が付与されています。たとえば、変更できます: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment キー: システムの pathEnv の末尾に追加される BPATH。

しかし、変更を加えても、次の再起動まで変更は有効になりません。

「PATH」が後続のプログラムとウィンドウで常に更新されるように、BPATH の変更を通知できる「常にインストールされる」コマンド ラインを見つけたいと思います。

rundll user32.dll, [ BroadcastSystemMessage PATH CHANTGED... or somehting...]

条件:

  1. システムの詳細タブからではなく、レジストリを介してのみパスとbpathを編集できます...
  2. 標準の Windows 7 インストールに含まれていないソフトウェアはインストールしたくありません。
  3. 通常、これは PowerShell プロンプトの CMD プロンプトから実行する必要があります。
4

3 に答える 3

2

これは難しそうに聞こえますが、rundll32 では実行できません。ここには、rundll のドキュメントのリンク元である多くの質問があります。これは基本的に次の形式の関数のみを呼び出します。

 void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

http://support.microsoft.com/kb/164787

つまり、このツールで呼び出されるように設計された特別な関数と、引数を取らない単純な関数、または単に HWND を呼び出すことができます。

環境を更新するには、メッセージをブロードキャストする (つまりにSendMessageTimeout)HWND_BROADCAST必要があります。WM_SETTINGCHANGEwparam0LPARAML"Environment"L

WM_SETTINGCHANGEこれは、誰が書いたか覚えていない実際の PS コードです (実際には、C++ から翻訳された MSDN の例です)。

    #requires -version 2

    if (-not ("win32.nativemethods" -as [type])) {
        # import sendmessagetimeout from win32
        add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessageTimeout(
        IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
        uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
    "@
    }

    $HWND_BROADCAST = [intptr]0xffff;
    $WM_SETTINGCHANGE = 0x1a;
    $result = [uintptr]::zero

    # notify all windows of environment block change
    [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,
            [uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

これは複数のコマンドですが、小さなスクリプトに収まります。

変数内の変数 (PATH) を使用してトリックを試したことはありませんが、そのような構成では、2 回の更新が必要になる可能性があります (最初の更新では BPATH を更新でき、2 回目の更新では PATH が更新された BPATH を使用します)。価値。

于 2012-07-24T00:15:37.553 に答える
1

Powershell では、次のコマンドはシステム変数 'variableName' を variableValue の値に設定します。最後の値はMachineUserまたはProcess

PS C:\>[Environment]::SetEnvironmentVariable("variableName","variableValue","Machine")

シェルは更新環境ブロードキャストをシステムに送信します。開いているシェルは、新しい環境変数を受け取りません。

于 2010-11-24T20:17:12.003 に答える
1

パワーシェル:

[Environment]::SetEnvironmentVariable("path",[Environment]::GetEnvironmentVariable("path"),"Machine")

ほら、パスマシン変数を自分自身に設定します

(「パス」を変更し、Explorer.exe を更新しなかった場合、Powershell はおそらく現在の環境を再度リセットすることに注意してください!)

于 2016-07-29T16:06:29.547 に答える