Значения не обновляются в функции PowerShell

Я сделал код для получения некоторых переменных и значений из файла TXT. Код выглядит так, и он работает так, как ожидалось:

Get-Content "C:\Temp\File.txt" | ? {$_ -match " = "} | % {
    $Item = $_.Split('=')
    if (Test-Path Variable:\$($Item[0])) {
        Set-Variable -Name $Item[0] -Value $Item[1]
        Write-Host $Item[0] $Item[1]
    } else {
        New-Variable -Name $Item[0] -Value $Item[1] -Force
    }
}
Write-Host $IPaddress
Write-Host $Hostname

Файл .txt выглядит так:

IPaddress=192.168.1.100
Hostname=server01

Итак, в этом примере я получаю переменные $IPaddress и $Hostname с их значениями из файла TXT. Однако, поскольку мне нужно использовать этот код довольно часто, или потому, что значения в файле TXT обновляются, или чтобы получить его из других файлов TXT, я включил его в функцию:

function GetInfo {
    Param(
        [string]$FilePath
    )
    Get-Content $FilePath | ? {$_ -match " = "} | % {
        $Item = $_.Split('=')
        if (Test-Path Variable:\$($Item[0])) {
            Set-Variable -Name $Item[0] -Value $Item[1]
            Write-Host $Item[0] $Item[1]
        } else {
            New-Variable -Name $Item[0] -Value $Item[1] -Force
        }
    }
}

GetInfo -FilePath "C:\Temp\File.txt"

Write-Host $IPaddress
Write-Host $Hostname

И вот проблема! В первый раз, когда я запускаю скрипт, не беспокойтесь, переменные и значения получаются правильно. Однако, если я изменю значения в файле TXT (например, IP-адрес изменится на 192.168.1.200) и снова выполню скрипт, я увижу в самой функции, что новый IP-адрес правильно получен из Write-Host $Item[0] $Item[1], но в конец, значение $IPaddress не будет обновляться (Write-Host $IPaddress по-прежнему будет отображать 192.168.1.100).

Ваши переменные создаются в локальной области и, следовательно, не существуют в глобальной области. Вы можете явно указать область действия при создании переменной. Однако лучшим и гораздо более простым способом было бы просто использовать другой сценарий PowerShell с определениями переменных.

Ansgar Wiechers 26.07.2019 09:37
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
0
1
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Область действия переменных должна быть объявлена ​​глобальной. Это можно сделать методом Set-Variable, как показано ниже,

function GetInfo {
    Param(
        [string]$FilePath
    )
    Get-Content $FilePath | ? {$_ -match " = "} | % {
        $Item = $_.Split('=')
        if (Test-Path Variable:\$($Item[0])) {
            Set-Variable -Name $Item[0] -Value $Item[1] -Scope global
           #Write-Host $Item[0] $Item[1]
        } else {          
            New-Variable -Name $Item[0] -Value $Item[1] -Force
        }
    }
}

GetInfo -FilePath "C:\Temp\File.txt"

Write-Host $IPaddress
Write-Host $Hostname

В приведенном выше коде вы можете видеть, что я упомянул область действия как глобальную. Попробуйте тот. Это должно решить вашу проблему.

Set-Variable -Name $Item[0] -Value $Item[1] -Scope global

Спасибо вам обоим, проблема решена, я действительно не подумал о масштабах... Еще раз спасибо!!!

John 26.07.2019 10:39

Рад помочь @Johann!

Suhas Parameshwara 26.07.2019 10:40

Другие вопросы по теме