Пути к среде без перезаписи строки - PullRequest
1 голос
/ 18 июня 2020

Я хотел бы задать вопрос о том, как мне действовать или как мне исправить код. Моя проблема в том, что мне нужен мой код, чтобы записать в Path три разных пути для Logsta sh, Kibana и ElasticSearch, но я понятия не имею, как это сделать. Он всегда возвращает одну и ту же ошибку об отсутствии ошибки ")"

Вот весь код ¨

[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
 }

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я давно go Я написал несколько функций для добавления пути к системному пути + это проверка, находится ли путь уже внутри системного пути. И я также проверил высоту, поэтому, когда я использую эту функцию и забыл поднять свою оболочку 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"
0 голосов
/ 18 июня 2020

Я действительно думаю, что вы могли бы это сильно упростить, если я не понял неправильно. Извините, я сейчас не на машине 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

Возможно, вы хотите добавить какой-то файл журнала, а не писать сообщения / предупреждения на консоль. Для этого вы можете использовать Add-Content .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...