2015-03-13 56 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