不覆盖字符串的环境路径

Enviroment Paths without overwriting String

我想问一下我应该如何继续或我应该如何修复代码。 我的问题是我需要我的代码将 Logstash、Kibana 和 ElasticSearch 的三个不同路径写入路径,但我不知道该怎么做。它 returns 总是关于缺少 ")" 错误

这是完整的代码 ¨

[CmdletBinding(SupportsShouldProcess=$true)]
 param(
    [string]$NewLocation.GetType($ElasticSearch)
    [string]$ElasticSearch = "C:\Elastic_Test_Server\elasticsearch\bin"
    [string]$Kibana = "C:\Elastic_Test_Server\kibana\bin"
    [string]$Logstash = "C:\Elastic_Test_Server\logstash\bin"
    )
 Begin
 {

    #Je potřeba spustit jako Administrátor

     $regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
     $hklm = [Microsoft.Win32.Registry]::LocalMachine

     Function GetOldPath()
     {
         $regKey = $hklm.OpenSubKey($regPath, $FALSE)
         $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
         return $envPath
     }
 }

 Process
 {


     # Win32API errory
     $ERROR_SUCCESS = 0 
     $ERROR_DUP_NAME = 34
     $ERROR_INVALID_DATA = 13

     $NewLocation = $NewLocation.Trim();

     If ($NewLocation -eq "" -or $NewLocation -eq $null)
     {
         Exit $ERROR_INVALID_DATA
     }

     [string]$oldPath = GetOldPath
     Write-Verbose "Old Path: $oldPath"

     # Zkontroluje zda cesta již existuje
     $parts = $oldPath.split(";")
     If ($parts -contains $NewLocation)
     {
         Write-Warning "The new location is already in the path"
         Exit $ERROR_DUP_NAME
     }

     # Nová cesta
     $newPath = $oldPath + ";" + $NewLocation
     $newPath = $newPath -replace ";;",""

     if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){

         # Přidá to přítomné session
         $env:path += ";$NewLocation"

         # Uloží do registru
         $regKey = $hklm.OpenSubKey($regPath, $True)
         $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
         Write-Output "The operation completed successfully."
     }

     Exit $ERROR_SUCCESS
 }

感谢您的帮助。

我真的认为你可以简化很多,除非我有误解。抱歉,我目前不在 Windows 机器上,因此无法对此进行测试。

function Add-ESPath {
    # Create an array of the paths we wish to add.
    $ElasticSearch = @(
        "C:\Elastic_Test_Server\elasticsearch\bin",
        "C:\Elastic_Test_Server\kibana\bin",
        "C:\Elastic_Test_Server\logstash\bin"
    )

    # Collect the current PATH string and split it out in to an array
    $CurrentPath = [System.Environment]::GetEnvironmentVariable("PATH")
    $PathArray = $CurrentPath -split ";"

    # Loop though the paths we wish to add.
    foreach ($Item in $ElasticSearch) {
        if ($PathArray -notcontains $Item) {
            $PathArray += $Item
        }
        else {
            Write-Output -Message "$Item is already a member of the path."      # Use Write-Warning if you wish. I see it more as a notification here.
        }
    }

    # Set the path.
    $PathString = $PathArray -join ";"
    Try {
        [System.Environment]::SetEnvironmentVariable("PATH", $PathString)
        exit 0
    }
    Catch {
        Write-Warning -Message "There was an issue setting PATH on this machine. The path was:"    # Use $env:COMPUTERNAME here perhaps instead of 'this machine'.
        Write-Warning -Message $PathString
        Write-Warning -Message $_.Exception.Message
        exit 1
    }
}

Add-ESPath

也许您想添加某种日志文件而不是将 messages/warnings 写入控制台。您可以为此使用 Add-Content

我很久以前写了一些函数来向系统路径添加路径+它们是检查路径是否已经在系统路径中。而且我还进行了海拔检查,所以当我使用此功能时,我忘记提升我的 powershell,我收到警告。不一样的做法,希望对你有所帮助

当我想编写一个不包括管道输入的函数时,我只使用 begin {} proccess{} 语句。因此,如果您想编写一个如下所示的函数:

$paths = @("C:\Elastic_Test_Server\elasticsearch\bin", "C:\Elastic_Test_Server\kibana\bin")
$paths | my-append-these-to-system-path-function

海拔检查:

function G-AmIelevated($warningMessage){
    if([bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")){
        return $true
    }else{
        write-host "not elevated $warningMessage" -ForegroundColor Red
        return $false
    }
}

向系统路径追加一些东西,检查它是否已经在系统路径中:

function G-appendSystemEnvironmentPath($str){
    if(test-path $str){
        if(!((Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path) -like "*$str*")){
            write-host "`t $str exists...`n adding $str to environmentPath" -ForegroundColor Yellow
            if(G-AmIelevated){
                write-host `t old: (Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path).Path
                Set-ItemProperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' `
                                    -Name Path `
                                    -Value "$((Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path).Path);$str"
                write-host `t new: (Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path).Path
                write-host `t restart the computer for the changes to take effect -ForegroundColor Red
                write-host `t `$Env:Path is the merge of System Path and User Path This function set the system path   
                write-host `t $str appended to environmet variables. -ForegroundColor Green
            }else{
                write-host `t rerun ise in elevated mode -ForegroundColor Red
            }   
        }else{
            write-host "`t $str is in system environmenth path"
        }
    }else{
        write-host `t $str does not exist
    }
}

G-appendSystemEnvironmentPath -str "C:\Elastic_Test_Server\elasticsearch\bin"
G-appendSystemEnvironmentPath -str "C:\Elastic_Test_Server\kibana\bin"
G-appendSystemEnvironmentPath -str "C:\Elastic_Test_Server\logstash\bin"