我有文本文件。我对文件进行编辑,完成编辑后,我要存储数据并通过编辑覆盖文件。
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
;**********************************
答案 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
被视为变量的原因是因为它们存在于双引号("
)之间,并且没有被转义。