Я переписал вашу функцию, потому что хотя ConvertFrom-Stringdata
удобен для чтения, здесь кажется неудобным записывать данные обратно в файл в нужном формате.Вы также жестко закодировали строку «CRM» в своей функции, что делает ConvertFrom-Stringdata
менее мощным.Вот пример использования жестко закодированной строки "CRM".
Function CRM
{
Param(
[parameter(mandatory=$true)] $FilePath,
[parameter(mandatory=$true)] $CRM
)
$FileContents = Get-Content $FilePath
$FileContents -replace "^(?<1>;CRM=).*","`${1}$CRM" | Set-Content $FilePath
}
Выполнение вышеуказанной функции:
CRM $filepath "AFF"
Get-Content $filepath
***********************************
;ML=DPC
;CRM=AFF
;**********************************
Альтернативная функция, которая обновит значение любого ключа в вашем файлеФормат содержимого следующий:
Function Update-Value
{
Param(
[parameter(mandatory=$true)] $FilePath,
[parameter(mandatory=$true)] $Key,
[parameter(mandatory=$true)] $Value
)
$FileContents = Get-Content $FilePath
$FileContents -replace "^(?<1>;$Key=).*","`${1}$Value" | Set-Content $FilePath
}
Результат выполнения вышеуказанной функции:
Get-Content $filepath
***********************************
;ML=DPC
;CRM=AE
;**********************************
Update-Value $filepath "CRM" "AFF"
Update-Value $filepath "ML" "NewML"
Get-Content $filepath
***********************************
;ML=NewML
;CRM=AFF
;**********************************
Если бы я должен был дополнить вашу функцию, продолжайте использовать ConvertFrom-Stringdata
, меняя при этом лишь немногонасколько возможно, я бы сделал что-то вроде следующего:
Function CRM
{
Param(
[parameter(mandatory=$true)]$FilePath,
[parameter(mandatory=$true)] $CRM
#parameter(mandatory=$true)] $Variable_Name
)
$FileContents = Get-Content $FilePath
$filteredContent = $FileContents -replace '^;' -replace '\\','\\' |
Where-Object{-not $_.startswith('*')}
$information = [pscustomobject]($filteredContent -join "`r`n" | ConvertFrom-StringData)
$information.CRM = $CRM
$informationFormatted = ForEach ($p in $information.psobject.properties) {
";{0}={1}" -f $p.name,$p.value
}
$FileContents[0],$informationFormatted,$FileContents[-1] | Set-Content $filepath
}
Объяснение:
Оператор -replace
выполняет всю работу.Текст для замены ^(;$Key=).*
использует механизм сопоставления Regex.^
указывает начало строки.Скобки создают группу захвата, к которой можно получить доступ в строке подстановки как $1
.;
и =
- буквальные совпадения.$Key
заменяется значением параметра $Key
из вызова функции..*
- все символы до конца текущей строки.$1$Value
- регулярное выражение подстановки.$1
- это то, что записывается в группе захвата 1, отмеченной ()
в соответствующей строке$Value
- это значение параметра $Value
при вызове функции.$1
является обратным тэгом, так что PowerShell не будет пытаться раскрыть его как строковую переменную.Это специфический для регулярных выражений языковой элемент, который представляет шаблон замены, а не типичную переменную.Причина, по которой $Key
и $Value
оцениваются как переменные, заключается в том, что они существуют между двойными кавычками ("
) и не экранированы.