2

某些文本文件 (pfile.ora) 的一部分如下所示:

fubar.__db_cache_size=1040187392
fubar.__pga_aggregate_target=1291845632
*.audit_file_dest='C:\app\oracle\admin\fubar\adump'
*.db_recovery_file_dest='\\nas3\backup\SRV07\fast_recovery_area\fubar'
*.db_recovery_file_dest_size=42949672960
*.dispatchers='(PROTOCOL=TCP) (SERVICE=fubarXDB)'

在该文件中,需要更新 1 个参数。我在某个地方找到了这个函数来读取和解析文件:

function Parse-IniFile ($file) {
   $ini = @{}
   switch -regex -file $file {
      "^\s*([^#].+?)\s*=\s*(.*)" {
         $name,$value = $matches[1..2]
         $ini[$name] = $value.trim()
      }
   }
   $ini
}

结果存储在变量 $aLines 中:

$aLines = Parse-IniFile ('pfile.ora');

更新参数后:

$aLines.'*.db_recovery_file_dest' = "'\\nas4\backup\SRV07\fast_recovery_area\fubar'";

...显示 $aLines 的内容会导致:

Name                              Value
----                              -----
*.db_recovery_file_dest          '\\nas3\backup\SRV07\fast_recovery_area\fubar'
fubar.__db_cache_size            1040187392
fubar.__pga_aggregate_target     1291845632
*.audit_file_dest                'C:\app\oracle\admin\fubar\adump'
etc...

元素都是完全无序的!我需要按原样订购它们。后:

$sOut = "";
foreach($oLine in $aLines.GetEnumerator() ) {
   $sOut += $oLine.name + "=" + $oLine.value +"`r`n";
}

并将 $sOut 写入文件,不再有任何行位于其原始位置。

长话短说,一个简单的问题:我如何让结果恢复原样,仍然能够轻松更改其中一个参数?

任何帮助将不胜感激!

4

2 回答 2

1

由于您要做的只是修改一行,因此我将完全删除该功能并简单地执行以下操作:

$file     = '.\pfile.ora'
$key      = [regex]::Escape('*.db_recovery_file_dest')
$newValue = '\\nas4\backup\SRV07\fast_recovery_area\fubar'

(Get-Content $file) -replace "($key=).*","`$1$newValue" | Out-File $file
于 2013-09-04T20:29:05.950 回答
0

由于您将原始条目存储在哈希表中,因此原始排序会丢失并且基于哈希表的内部哈希算法。我认为最简单的解决方案是在解析文件时缓存原始顺序,然后在输出时使用它。

所以改变你的解析功能是这样的:

function Parse-IniFile ($file) {
   $ini = @{}
   $fields = @() # to store the order
   switch -regex -file $file {
      "^\s*([^#].+?)\s*=\s*(.*)" {
         $name,$value = $matches[1..2]
         $ini[$name] = $value.trim()
         $fields += $name
      }
   }
   $ini,$fields
}

现在,当您调用该函数时,您必须将每个返回的对象存储在一个单独的变量中,如下所示:

$aLines,$fields = Parse-IniFile .\pfile.ora

进行编辑后,您可以使用$fields变量以原始顺序输出:

$fields | foreach{"$_=$($aLines[$_])"}
于 2013-09-04T20:16:37.383 回答