Как сохранить файл после редактирования в PowerShell? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть текстовый файл. Я выполняю редактирование файла, после завершения редактирования я хочу сохранить данные и перезаписать файл при редактировании.

My file
***********************************
;ML=DPC
;CRM=AE
;********************************** 

Function CRM
{
    Param(
    [parameter(mandatory=$true)]$FilePath,
    [parameter(mandatory=$true)] $CRM
    #parameter(mandatory=$true)] $Variable_Name
    )

$filteredContent = (Get-Content $FilePath) -replace '^;' -replace '\\','\\' |
    Where-Object{-not $_.startswith('*')} 
$information = [pscustomobject]($filteredContent -join "`r`n" | ConvertFrom-StringData)


$CRM_1 = $information.CRM
$CRM_Edit = "$CRM"
$CRM_Edit | Out-File -FilePath $FilePath -Force
}
#---------------------------------------------------------------------------------------------------------------------#

Мое ожидание после редактирования значения от CRM до AFF, у меня будет такой текстовый файл.

***********************************
;ML=DPC
;CRM=AFF
;**********************************

1 Ответ

1 голос
/ 31 марта 2019

Я переписал вашу функцию, потому что хотя 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 оцениваются как переменные, заключается в том, что они существуют между двойными кавычками (") и не экранированы.

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