Bjø*_*sen 8 powershell environment-variables windows-8
我正在使用 GitHub for Windows 应用程序。最近我注意到从 GitHub 应用程序中启动 PowerShell 控制台需要很长时间。经过一番挖掘,我发现慢命令正在设置一个环境变量。更具体地说,GitUtils.ps1 中的这些行(GitHub 使用的 PoshGit 的一部分):
function setenv($key, $value) {
[void][Environment]::SetEnvironmentVariable($key, $value, [EnvironmentVariableTarget]::Process)
[void][Environment]::SetEnvironmentVariable($key, $value, [EnvironmentVariableTarget]::User)
}
Run Code Online (Sandbox Code Playgroud)
设置 Process-wide 变量是即时的,但 User 变量需要很长时间。使用以下脚本:
$sw = [Diagnostics.Stopwatch]::StartNew()
[Environment]::SetEnvironmentVariable("Horses", "are neat", [EnvironmentVariableTarget]::User)
$sw.Stop()
$sw.Elapsed
Run Code Online (Sandbox Code Playgroud)
我可以看到这个操作需要超过 80 秒。使用默认的高级设置窗口设置用户环境变量很快。使用快速环境编辑器,设置一个变量通常很快,但有时需要 5-10 秒,但从来没有这么长的时间。
有人对可能导致这种情况的原因有任何建议吗?
小智 12
根据 Environment 类源(可以在这里找到,第 864 行),在设置用户/机器范围环境变量后,它调用本机 SendMessageTimeout 函数来通知任何进程有关环境的变化。这是摘录:
IntPtr r = Win32Native.SendMessageTimeout(
new IntPtr(Win32Native.HWND_BROADCAST),
Win32Native.WM_SETTINGCHANGE,
IntPtr.Zero,
"Environment",
0,
1000,
IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
因此,任何接收者都有 1000 毫秒(1 秒)的超时时间来处理消息。例如,如果其中 5 个未能处理它,您可能会有多达 5 秒的延迟。可以在MSDN 中找到有关 SendMessageTimeout 的更多信息。
希望有帮助。
归档时间: |
|
查看次数: |
3489 次 |
最近记录: |