Я сделал код для получения некоторых переменных и значений из файла 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).

Область действия переменных должна быть объявлена глобальной. Это можно сделать методом 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
Спасибо вам обоим, проблема решена, я действительно не подумал о масштабах... Еще раз спасибо!!!
Рад помочь @Johann!
Ваши переменные создаются в локальной области и, следовательно, не существуют в глобальной области. Вы можете явно указать область действия при создании переменной. Однако лучшим и гораздо более простым способом было бы просто использовать другой сценарий PowerShell с определениями переменных.