ฉันพบปัญหานี้เช่นกัน กรณีของฉันเป็นดังต่อไปนี้:
ในข้อความ:
HKEY_CURRENT_USER\Environment
Path REG_SZ %JAVA_HOME%\bin;C:\ProgramFiles\nodejs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
JAVA_HOME REG_SZ C:\ProgramFiles\Java\jdk
Path REG_EXPAND_SZ C:\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\
WindowsPowerShell\v1.0\;C:\Program Files\Intel\DMIX;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Progra
m Files (x86)\Perforce;C:\ProgramFiles\010 Editor;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\ProgramFiles\
Git\cmd;C:\Program Files (x86)\Skype\Phone\
C:\Users\ssfang> echo %^JAVA_HOME% = "%^JAVA_HOME%" = %%JAVA_HOME%% %JAVA_HOME%
%JAVA_HOME% = "%^JAVA_HOME%" = %C:\ProgramFiles\Java\jdk% C:\ProgramFiles\Java\jdk
ฉันพบว่าประเภทของค่ารีจิสทรีPath
แตกต่างกันดังนั้นฉันจึงตรวจสอบว่าเส้นทางนั้นถูกต้องหรือไม่โดยคำสั่งต่อไปนี้:
C:\Users\ssfang> where node java
C:\ProgramFiles\nodejs\node.exe
INFO: Could not find "java".
เป็นผลให้ฉันรีเซ็ตสภาพแวดล้อมท้องถิ่น (ผู้ใช้ปัจจุบัน) ด้วยคำสั่งต่อไปนี้ ( Setx ):
C:\Users\ssfang> setx PATH %^JAVA_HOME%\bin;"C:\ProgramFiles\nodejs"
SUCCESS: Specified value was saved.
C:\Users\ssfang> reg query HKEY_CURRENT_USER\Environment /v Path
HKEY_CURRENT_USER\Environment
Path REG_EXPAND_SZ %JAVA_HOME%\bin;C:\ProgramFiles\nodejs
C:\Users\ssfang> where node java
C:\ProgramFiles\nodejs\node.exe
INFO: Could not find "java".
C:\Users\ssfang>echo %PATH%
C:\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Fi
les\Intel\DMIX;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\Perforce;C:\ProgramFile
s\010 Editor;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\ProgramFiles\Git\cmd;C:\Program Files (x86)\Skype\
Phone\;%JAVA_HOME%\bin;C:\ProgramFiles\nodejs
แต่ในกระบวนการปัจจุบันมันไม่สามารถเผยแพร่การเปลี่ยนแปลงเหล่านั้นไปยังกระบวนการทำงานอื่น ๆ
อย่างไรก็ตามหากคุณแก้ไขตัวแปรสภาพแวดล้อมของผู้ใช้โดยตรงใน Registry Editor
การดัดแปลงตัวแปรสภาพแวดล้อมเหล่านั้นไม่ส่งผลให้เกิดการเปลี่ยนแปลงในทันที ตัวอย่างเช่นถ้าคุณเริ่มต้นพร้อมรับคำสั่งอื่นหลังจากทำการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมจะแสดงถึงค่าก่อนหน้า (ไม่ใช่ค่าปัจจุบัน) การเปลี่ยนแปลงจะไม่มีผลจนกว่าคุณจะออกจากระบบและเข้าสู่ระบบอีกครั้ง
เมื่อต้องการให้การเปลี่ยนแปลงเหล่านี้เกิดขึ้นโดยไม่ต้องออกจากระบบให้ส่งข้อความ WM_SETTINGCHANGE ไปยังหน้าต่างทั้งหมดในระบบเพื่อให้แอปพลิเคชันที่สนใจ (เช่น Windows Explorer, โปรแกรมจัดการ, ตัวจัดการงาน, แผงควบคุมและอื่น ๆ ) สามารถทำการอัปเดตได้
ดูรายละเอียดได้ที่วิธีเผยแพร่ตัวแปรสภาพแวดล้อมไปยังระบบ
ที่นี่ฉันให้สคริปต์ PowerShell ที่จะทำ:
# powershell -ExecutionPolicy ByPass -File
# Standard, inline approach: (i.e. behaviour you'd get when using & in Linux)
# START /B CMD /C CALL "foo.bat" [args [...]]
# powershell -ExecutionPolicy ByPass -WindowStyle Hidden -File myScript.ps1
<#
Add-Type @'
public class CSharp
{
public static void Method(object[] first, object[] second)
{
System.Console.WriteLine("Hello world");
}
}
'@
$a = 1..4;
[string[]]$b = "a","b","c","d";
[CSharp]::Method($a, $b);
#>
<#
#http://stackoverflow.com/questions/16552801/how-do-i-conditionally-add-a-class-with-add-type-typedefinition-if-it-isnt-add
#Problem Add-Type : Cannot add type. The type name 'PInvoke.User32' already exists.
if (-not ("MyClass" -as [type])) {
add-type @"
public class MyClass { }
"@
}
p.s. there's no Remove-Type; see this answer for more on how to best work around this limitation:
http://stackoverflow.com/questions/3369662/can-you-remove-an-add-ed-type-in-powershell-again
I think it will be wanted when debugging.
It is much simpler to close a tab in Console and open new one in PowerShell_ISE.exe or close PowerShell.exe.
Or
Start-Job -ScriptBlock {
param([uri]$url,$OutputDir)
# download and save pages
Invoke-RestMethod $url | Out-File "$OutputDir\$($url.Segments[-1])" -Force
} -ArgumentList $link,$OutputDir
#>
if (-not ([System.Management.Automation.PSTypeName]'PInvoke.Program').Type)
{
$sig=@"
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.Generic;
// The global namespace is the "root" namespace: global::system will always refer to the .NET Framework namespace System.
///P/Invoke (Platform Invoke)
namespace PInvoke
{
public static class User32
{
/// http://www.pinvoke.net/default.aspx/Constants/HWND.html
// public const IntPtr HWND_BROADCAST = new IntPtr(0xffff);
/// https://msdn.microsoft.com/en-us/library/windows/desktop/ms725497(v=vs.85).aspx
/// http://www.pinvoke.net/default.aspx/Constants/WM.html
public const UInt32 WM_SETTINGCHANGE = 0x001A;
// SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
/// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx
/// If the function succeeds, the return value is nonzero.
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageTimeout", SetLastError = true)]
public static extern uint SendMessageTimeout(IntPtr hWnd, uint Msg, int wParam, string lParam, SendMessageTimeoutFlags fuFlags, uint uTimeout, out int lpdwResult);
}
[Flags]
public enum SendMessageTimeoutFlags : uint
{
SMTO_NORMAL = 0x0,
SMTO_BLOCK = 0x1,
SMTO_ABORTIFHUNG = 0x2,
SMTO_NOTIMEOUTIFNOTHUNG = 0x8,
SMTO_ERRORONEXIT = 0x20
}
public class Program
{
public static void Main(string[] args)
{
//int innerPinvokeResult;
//uint pinvokeResult = User32.SendMessageTimeout(User32.HWND_BROADCAST, User32.WM_SETTINGCHANGE, 0, "Environment", SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out innerPinvokeResult);
Console.WriteLine("Over!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
}
"@
Add-Type -TypeDefinition $sig
}
## [PInvoke.Program]::Main([IntPtr]::Zero);
$innerPinvokeResult=[int]0
[PInvoke.User32]::SendMessageTimeout([IntPtr]0xffff, [PInvoke.User32]::WM_SETTINGCHANGE, 0, "Environment", [PInvoke.SendMessageTimeoutFlags]::SMTO_NORMAL, 1000, [ref]$innerPinvokeResult);
Setx setx [/ s [/ u [] [/ p []]]] [/ m]
/m Specifies to set the variable in the system environment. The default setting is the local environment
Java Runtime Environment
ไม่ใช่ JRE SDK ...