【问题标题】:Update properties file using powershell使用 powershell 更新属性文件
【发布时间】:2015-02-19 21:35:11
【问题描述】:

我想使用 powershell 更新下面的属性文件内容并将 ${BuildPath} 替换为 location = D:\Data\Sample\lib

tibco.alias.junit.jar=${BuildPath}\\junit.jar
tibco.alias.TextDiff.jar=${BuildPath}\\TextDiff.jar
tibco.alias.XMLDiff.jar=${BuildPath}\\XMLDiff.jar

有人可以帮我在 powershell 上进行逻辑更新此属性文件。

谢谢

【问题讨论】:

  • 文件上还有其他属性吗?还是这样?
  • Matt,以上内容在一个属性文件(alias.properties)中,我只想将 ${BuildPath} 替换为位置(D\:\\Data\\Sample\\lib)跨度>
  • 是否需要转义所有斜杠和冒号?

标签: powershell


【解决方案1】:

所以你有一个包含这些属性的文件是吗?谁说它是如何创建的,或者这是否是唯一的内容?让我们假设您有一个包含许多属性的文件,以防万一。您想要导航文件,将所有出现的${BuildPath} 替换为D:\Data\Sample\lib

$replacePath = "D:\Data\Sample\lib"
$newFile = Get-Content c:\temp\file.ini | ForEach-Object{
    $_ -replace '\${BuildPath}',($replacePath -replace '\\',"\\")
} 
$newFile | Set-Content c:\temp\file.ini

这将在c:\temp\file.ini 中给出以下输出

tibco.alias.junit.jar=D:\\Data\\Sample\\lib\\junit.jar
tibco.alias.TextDiff.jar=D:\\Data\\Sample\\lib\\TextDiff.jar
tibco.alias.XMLDiff.jar=D:\\Data\\Sample\\lib\\XMLDiff.jar

* 正则表达式只会替换每行的第一次出现。无论如何,怀疑会不止一个。

【讨论】:

    【解决方案2】:

    如果您要重写整个文件并且不需要保留 cmets,您可以在此处使用加载语法 https://stackoverflow.com/a/20276315/3794873,然后在此处使用写入语法 https://stackoverflow.com/a/35210799/3794873,但请注意有关丢失排序的说明。

    如果您需要保持原始顺序,请使用 -replace 查看其他答案,或在 PowerShell 中创建 OrderedDict 并通过文件中各行的循环填充它(参见下面代码中的示例)。

    我在下面的示例中压缩了上面链接的问题和答案。

    $filename = 'myfile.properties'
    $filedata = @'
    app.name=Test App
    app.version=1.2
    app.data=Some words
    '@
    
    $filedata | set-content $filename
    
    
    # This method doesn't maintain ordering
    $fileProps = convertfrom-stringdata (Get-Content $filename | Out-String) 
    #could use also use -raw in PS 3 or higher instead of | Out-String
    Write-Output "Initial data"
    $fileProps.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Write-Output
    $fileProps['app.name'] = 'StringData App'
    Write-Output "Updated data"
    $fileProps.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Write-Output
    $fileProps.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File .\myfile.stringdata.properties -Encoding "ASCII"
    
    # This method uses an ordered dict to maintain... order    
    $dict = [ordered]@{}
    Get-Content $filename | foreach-object {$dict.add($_.split('=',2)[0],$_.split('=',2)[1])}
    Write-Output "Initial data"
    $dict.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Write-Output
    $dict['app.name'] = 'Ordered Dict App'
    Write-Output "Updated data"
    $dict.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Write-Output
    $dict.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File .\myfile.ordered.properties -Encoding "ASCII"
    

    【讨论】:

    • 如果文件包含多个相等的 cmets 怎么办?它抱怨它不能再次添加密钥...
    • 我担心重复的 cmets 会很棘手,并且可能需要通过以稍微不同的方式逐行读取文件并附加一个数字来跟踪“看到”相同评论的次数到第一个实例之后的每个实例,然后再转换为哈希表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2019-03-04
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多