You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell脚本替换tnsnames.ora中未知的HOST值

用PowerShell批量替换tnsnames.ora中的HOST字段值

需求:编写PowerShell脚本,将tnsnames.ora文件中所有形如(HOST = 任意主机名)的内容替换为指定主机名。要求兼容HOST字段不在行首、一行多等号、多次出现的场景。

示例tnsnames.ora文件

A01.WORLD=   (DESCRIPTION =
    (SDU = 32768)
    (ADDRESS_LIST =
        (ADDRESS =
          (COMMUNITY = SAP.WORLD)
          (PROTOCOL = TCP)
          (HOST = columbus)
          (PORT = 1529)
       )
    (CONNECT_DATA =
       (SID = A01)
       (GLOBAL_NAME = A01.WORLD)
    )   )

TEC.WORLD=   (DESCRIPTION =
    (ADDRESS_LIST =
        (ADDRESS =
          (COMMUNITY = TEC.WORLD)
          (PROTOCOL = TCP)
          (HOST = columbus)
          (PORT = 1521)
        )
    )
    (CONNECT_DATA =
       (SID = TEC)
        (GLOBAL_NAME = TEC.WORLD)
        ) )

原代码的问题

之前尝试的代码通过按=分割行处理,遇到一行包含多个=(比如A01.WORLD= (DESCRIPTION =)时会错误分割,且代码逻辑仅创建变量,完全未实现HOST字段的替换需求。

原尝试代码:

Get-Content file.txt | Where-Object {$_.length -gt 0} | Where-Object {!$_.StartsWith("#")} | ForEach-Object {
   
    $var = $_.Split('=',2).Trim()
    New-Variable -Scope Script -Name $var[0] -Value $var[1]
    
}

正确的解决方案

使用正则表达式精准匹配HOST字段,既能保留原文件的缩进、空格格式,又能准确替换主机名。

完整脚本

# 配置目标主机名和文件路径
$targetHost = "your-new-host"
$filePath = "C:\path\to\tnsnames.ora"

# 读取文件内容并逐行处理替换
(Get-Content $filePath) | ForEach-Object {
    # 正则匹配:捕获HOST字段的前缀(含空格和等号),替换后续的主机名
    $_ -replace '(\s*HOST\s*=\s*).+$', "`$1$targetHost"
} | Set-Content $filePath -Encoding UTF8

脚本说明

  • (\s*HOST\s*=\s*):正则捕获组,匹配HOST字段前的任意空格、HOST本身、等号及等号后的任意空格,保留原文件的缩进格式
  • .+$:匹配等号后到行尾的所有内容(即原主机名)
  • "$1$targetHost"`:将匹配到的内容替换为捕获的前缀加上目标主机名
  • 脚本会处理文件中所有符合格式的HOST行,不影响其他内容

处理后示例效果

原文件中的(HOST = columbus)都会被替换为(HOST = your-new-host),其他行的格式和内容保持不变。

内容的提问来源于stack exchange,提问作者PACSMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:40:26