У меня есть 4.ps1
файл, который выглядит так
#akabradabra
$one = 'o'
#bibi
$two = 't'
$three = 't' #ok thr
#four
$four = 'four'
И 3.ps1
файл, который выглядит так
#akabradabra
$one = 'one'
#biblibablibo
$two = 'two'
$three = 'three' #ok threer
Моя цель - прочитать пару ключ-значение из 4.ps1
и обновить значения в 3.ps1
, а если новые пары ключ-значение введены в 4.ps1
, просто добавьте их в конец 3.ps1
.
Моя идея состоит в том, чтобы использовать строковые функции, такие как .Split('=')
и .Replace(' ', '')
, чтобы извлечь ключи, и, если ключи совпадают, заменить всю строку в 3.ps1
на строку, найденную в 4.ps1
Я знаю, что использование Get-Variable
может помочь, а также будет намного проще работать с данными, если я преобразую все пары ключ-значение в файл .xml
или .json
, но может кто угодно пожалуйста, покажи мне, как я могу заставить его работать по-своему глупо?
Вот мой код для этого
# Ignore this function, this is used to skip certain key-value pairs
#----------------------------------------------------------------------------
Function NoChange($something) {
switch ($something) {
'$CurrentPath' {return $true}
'$pathToAdmin' {return $true}
'$hostsPathTocompare' {return $true}
'$logs' {return $true}
'$LogFile' {return $true}
default {return $false}
}
}
#----------------------------------------------------------------------------
$ReadFromVARS = Get-Content $PSScriptRoot\4.ps1
$WriteToVARS = Get-Content $PSScriptRoot\3.ps1
foreach ($oldVar in $ReadFromVARS) {
if (('' -eq $oldVar) -or ($oldVar -match '\s*#+\w*')) {
continue
} elseif ((NoChange ($oldVar.Split('=').Replace(' ', '')[0]))) {
continue
} else {
$var = 0
#$flag = $false
while ($var -ne $WriteToVARS.Length) {
if ($WriteToVARS[$var] -eq '') {
$var += 1
continue
} elseif ($WriteToVARS[$var] -match '\s*#+\w*') {
$var += 1
continue
} elseif ($oldVar.Split('=').Replace(' ', '')[0] -eq $WriteToVARS[$var].Split('=').Replace(' ', '')[0]<# -and !$flag#>) {
$oldVar
$WriteToVARS.replace($WriteToVARS[$var], $oldVar) | Set-Content -Path $PSScriptRoot\3.ps1 -Force
break
#$var += 1
#$flag = $true
} elseif (<#!$flag -and #>($var -eq $WriteToVARS.Length)) {
Add-Content -Path $PSScriptRoot\3.ps1 -Value $oldVar -Force
$var += 1
} else {
$var += 1
}
}
}
}
Я не столкнулся с какими-либо ошибками, но он обновил только одну пару ключ-значение ($two = t
) и не добавил новые пары ключ-значение в конце. Вот результат, который я получил
#akabradabra
$one = 'one'
#biblibablibo
$two = 't'
$three = 'three' #ok threer