2016-12-14 104 views
1

需要跨多台计算机更新.INI文件并更改内容。我有以下的脚本作品:替换或添加.INI文件内容

(Get-Content SDA_Apps.ini) | Foreach-Object { 
$_ -replace "UserName=.+", "UserName=Test" ` 
    -replace "UserEmail=.+", "[email protected]" ` 
    -replace "UserNo=.+", "UserNo=1234" ` 
    -replace "UserKey=.+", "UserKey=^%&$*$778-" ` 
    -replace "KEM=.+", "KEM=H10" 
} | Set-Content SDA_Apps.ini 

有时文本的那些行不存在,我需要添加文本,而不是取代它。

这是我试图做到这一点 - 没有成功:

function setConfig($file, $key1, $value1, $key2, $value2) { 
    $content = Get-Content $file 
    if ($content -match "^$key\s*=") { 
     $content $_ -replace "^$key1\s*=.*", "$key1=$value1" -replace "^$key2\s*=.*", "$key2=$value2"| 
     Set-Content $file  
    } else { 
     Add-Content $file "$key1 = $value1" 
     Add-Content $file "$key2 = $value2" 
    } 
} 

setConfig "SDA_Apps.ini" "UserName" "Test" "UserEmail" "[email protected]" 

回答

1

我改写了你的函数,并给它改名以反映它actualy确实Set-OrAddIniValue

function Set-OrAddIniValue 
{ 
    Param(
     [string]$FilePath, 
     [hashtable]$keyValueList 
    ) 

    $content = Get-Content $FilePath 

    $keyValueList.GetEnumerator() | ForEach-Object { 
     if ($content -match "^$($_.Key)=") 
     { 
      $content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)" 
     } 
     else 
     { 
      $content += "$($_.Key)=$($_.Value)" 
     } 
    } 

    $content | Set-Content $FilePath 
} 

这个功能的好处是您可以将键值列表作为哈希表传递给它。它只读取一次ini文件,更新内容并将其保存回来。这里是一个用法示例:

Set-OrAddIniValue -FilePath "c:\yourinipath.ini" -keyValueList @{ 
    UserName = "myName" 
    UserEmail = "myEmail" 
    UserNewField = "SeemsToWork" 
} 
+1

感谢Martin表示完美。 – Ankh2054