2015-03-13 45 views
0

我有修改变量的环境中的C#控制台应用程序C#广播环境变量通知bat脚本?

RegistryKey key = Registry.CurrentUser.OpenSubKey("Environment", true); 
key.SetValue("BMKTARGET", targetLocation.Path, RegistryValueKind.String); 

的问题是,在cmd中运行它之后,我不得不关闭cmd,然后重新启动CMD识别这种变化....因为CMD需要被告知,它被修改,所以我试图运行此代码我在网上找到:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SendMessageTimeout(
    IntPtr hWnd, 
    int Msg, 
    int wParam, 
    string lParam, 
    int fuFlags, 
    int uTimeout, 
    out int lpdwResult 
); 

public const int HWND_BROADCAST = 0xffff; 
public const int WM_SETTINGCHANGE = 0x001A; 
public const int SMTO_NORMAL = 0x0000; 
public const int SMTO_BLOCK = 0x0001; 
public const int SMTO_ABORTIFHUNG = 0x0002; 
public const int SMTO_NOTIMEOUTIFNOTHUNG = 0x0008; 
//Run this function after modification 
static void BroadcastEnvironment() 
{ 
    int result; 
    SendMessageTimeout((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", 
     SMTO_BLOCK | SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, out result); 
} 

不知怎的,它仍不能正常工作,我怎么能解决这个问题?

注:

我试图通过运行此exe信息到.bat脚本...如果有更好的方式来做到这一点,我会很高兴与答案。

PS

有人提出的意见看起来是一个很好的建议,但没有足够的信息来测试它,如果有人能详细说,将不胜感激。

+1

什么让你觉得一个控制台应用程序,例如cmd.exe的具有运行'WindowProc'线程?它没有。资源管理器会这样做,这就是重新启动cmd.exe来检查更改的原因。 – eryksun 2015-03-13 16:35:01

+0

[处理控制台应用程序中的消息](https://msdn.microsoft.com/en-us/magazine/cc163417.aspx) – 2015-03-13 17:05:42

+0

@eryksun我不想重新启动,如果这样做会很烦人。 ....我不明白为什么我不能只是“更新”cmd.exe ...?顺便说一句,鳕鱼我发现声称工作在cmd.exe,我没有写它...... – user3765372 2015-03-13 18:06:57

回答

1

没有必要注册所有的注册表。

Environment.SetEnvironmentVariable("BMKTARGET", targetLocation.Path, 
            EnvironmentVariableTarget.User); 

var value = Environment.GetEnvironmentVariable("BMKTARGET", 
               EnvironmentVariableTarget.User) 

此外,该batch script发表@grawitySuperUser可能会有一些工具给你的。

@eryksun说,而不是脚本所有你需要的是这一个衬为您的批处理文件:

for /f "tokens=2*" %%a in ('reg query HKCU\Environment /v BMKTARGET') do set "BMKTARGET=%%b" 
+0

谢谢@eryksun。 “GetEnvironmentVariable”只是试图展示设置它的反面 - 为了完整性。我赞赏额外的一批班。 – 2015-03-14 09:28:29

+0

问题是我试图将数据从我的脚本传递到批处理文件......我没有试图将它设置在批处理文件中...... – user3765372 2015-03-14 21:22:40

+0

建议的命令给出了输出:'%% a在这个时候是意外的。“ – user3765372 2015-03-14 21:50:39