在PowerShell中编辑后如何存储文件?

时间:2019-03-31 04:10:35

标签: powershell

我有文本文件。我对文件进行编辑,完成编辑后,我要存储数据并通过编辑覆盖文件。

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 个答案:

答案 0 :(得分:1)

我重写了您的函数,因为尽管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被视为变量的原因是因为它们存在于双引号(")之间,并且没有被转义。