【问题标题】:VB.Net how to append a dir to the Path env variable in codeVB.Net如何在代码中将目录附加到Path env变量
【发布时间】:2020-11-08 17:57:21
【问题描述】:

我想为我的应用程序的用户提供一种简单的方法来更新应用程序所需的环境变量。 一般来说,我可以毫无问题地获取和设置环境变量,一切正常。

问题是当我更新 Path 环境变量时,其中的所有变量名都丢失了。例如,条目 %JAVA_HOME%\bin 在我读取时会扩展为完整路径,因此我无法将其写回扩展前的状态。

我尝试使用 %PATH%;myaddedpath 设置变量。这在 shell 中有效,但在代码中它实际上将 %PATH% 写入环境变量!

Private Sub AddStringtoPath(value As String)
        Dim lPathVar As String
        For a As Integer = 0 To lstPathList.Items.Count - 1
            If lstPathList.Items(a) = value Then
                Exit Sub
            Else
                lPathVar = lPathVar + ";" + lstPathList.Items(a)
            End If
        Next
        lstPathList.Items.Add(value)
        lPathVar = lPathVar.Substring(1, lPathVar.Length - 1)
        lPathVar = lPathVar + ";" + value

        Environment.SetEnvironmentVariable("Path", lPathVar + value, EnvironmentVariableTarget.Machine)
        RefreshFormData()
    End Sub

此代码解析一个列表框,其中包含路径变量的条目,将它们添加到字符串中,如果它到达末尾,则字符串尚未存在,因此它继续将其添加到路径变量中。

就目前而言,它可以正确地将现有行写回 Path 变量并添加我的新条目,但 Path 中的变量已经消失。 这是一个问题,因为如果用户更改路径中引用的环境变量的内容,代码将不再找到正确的位置。

有什么办法:

  • 在不扩展内部变量的情况下获取 Path 环境变量
  • 附加到现有的 Path 变量,而不会丢失其当前内容。

【问题讨论】:

  • 您是否考虑过使用My.Settings 来存储路径?也许VB.NET My.Settings deep dive 提供了一些有用的额外信息。
  • 您必须通过注册表并获取/设置PATH 值。使用 .OpenSubKey().GetValue("PATH", "", RegistryValueOptions.DoNotExpandEnvironmentNames),变量不会展开。
  • 在注册表中设置值听起来很有希望。我会尽快尝试。谢谢吉米。

标签: vb.net path environment-variables


【解决方案1】:

按照上面 Jimmi 的建议,它可以直接从注册表中读取和更新 Path 环境变量。这是代码。此版本允许我在不扩展内部变量的情况下读取条目,并且如果用户选择,还可以使用环境变量保存值。

lstPathList 是一个列表框,其中已经包含 Path 环境变量中的所有现有条目。

Private Sub AddStringtoPath(value As String)
    Dim lPathVar As String = ""
    Dim Status As Integer = MsgBox("Modifying environment variables can cause side effects. Are you sure?", vbOKCancel)
    If Status = vbOK Then
        For a As Integer = 0 To lstPathList.Items.Count - 1
            If lstPathList.Items(a) = value Then
                Exit Sub
            Else
                lPathVar = lPathVar + ";" + lstPathList.Items(a)
            End If
        Next
        lPathVar = lPathVar.Substring(1, lPathVar.Length - 1)
        lPathVar = lPathVar + ";" + value
        Dim regKey As Microsoft.Win32.RegistryKey
        regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
                            "System\CurrentControlSet\Control\Session Manager\Environment",
                            True)

        regKey.SetValue("Path", lPathVar)
        RefreshFormData()
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2012-02-13
    • 2020-04-20
    • 1970-01-01
    • 2016-10-02
    • 2015-01-02
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多