字符串 trim 并拆分

String trim and split

我有一个阅读的文本文件,我需要从中获取值。

示例文本文件:

[Site 01]
DBServer=LocalHost
DBName=Database01
Username=admin
Password=qwerty

[Site 02]
DBServer=192.168.0.10
DBName=Database02
Username=admin
Password=qwerty

目前我的代码通读文件并将每个文件作为找到的每一行的数组条目 DBServer= 并且这个文本文件可以有很多站点:

$NumOfSites = Get-Content $Sites |
              Select-String -Pattern "DBServer=" -Context 0,3
$i = 0
$NumOfSites | ForEach-Object {
    $svr  = $NumOfSites[$i] -isplit "\n" |
            % { ($_ -isplit 'DBServer=').Trim()[1] }
    $db   = $NumOfSites[$i] -isplit "\n" |
            % { ($_ -isplit 'DBName='.Trim())[1] }
    $uid  = $NumOfSites[$i] -isplit "\n" |
            % { ($_ -isplit 'Username='.Trim())[1] }
    $pswd = $NumOfSites[$i] -isplit "\n" |
            % { ($_ -isplit 'Password='.Trim())[1] }
    $i = $i+1
}

如果没有一些额外的空格或字符串变量,我无法正确拆分每个属性。 我只需要从我拥有的文件示例的格式中提取信息以作为变量放入 SQL 连接线。

如果您只关心获取等号后的值,这里有一个建议:

Get-Content Example.txt |
  ForEach-Object {
      Switch -Regex ($_) {
          'dbs.+=' { $svr = ($_ -replace '.+=').Trim()
          .. etc ..
      }
  }

Get-Content 传送到 ForEach-Object 会将每一行解释为它自己的对象。


编辑:
你大部分时间都在那里,但没有必要 -split

$NumOfSites = Get-Content $Sites | Select-String -pattern "DBServer=" -Context 0,3
$NumOfSites | ForEach-Object {
    Switch -Wildcard ($_) {
        'DBS*=' { $svr = ($_ -replace '.+=').Trim() }
        'DBN*=' { $db  = ($_ -replace '.+=').Trim() }
        'U*='   { $uid = ($_ -replace '.+=').Trim() }
        'P*='   { $pw  = ($_ -replace '.+=').Trim() }
    }
}

除了记录headers(即[Site 01]),其余的可以由ConvertFrom-StringData处理就好了。我们可以将记录转换为 objects 直接在 header 行或多或少地拆分。 ConvertFrom-StringData 将 multi-line 字符串转换为哈希表,您可以将其转换为 [PSCustomObject] 和中提琴,您拥有易于使用的 objects。

$NumOfSites = Get-Content $Sites -raw
$SiteObjects = $NumOfSites -split '\[.+?\]'|%{[PSCustomObject](ConvertFrom-StringData -StringData $_)}

然后您可以按照您认为合适的方式操作 $SiteObjects(如果需要,可以输出到 CSV,或者使用 Select-Object 过滤任何 属性)。或者,如果您想建立联系,您可以根据需要循环建立联系...

ForEach($Connection in $SiteObjects){
    $ConStr = "Server = {0}; Database = {1}; Integrated Security = False; User ID = {2}; Password = {3};" -f $Connection.DBServer.Trim(), $Connection.DBName.Trim(), $Connection.Username.Trim(), $Connection.Password.Trim()
    <Do stuff with SQL>
}

编辑: 更新我的答案,因为示例文本已更改为添加 <pre></pre>。我们只需要删除它们,并且由于 OP 收到关于空值方法的错误,我们也将过滤空值。

$NumOfSites = Get-Content $Sites -raw
$SiteObjects = $NumOfSites -replace '<.*?>' -split '\[.+?\]' | ?{$_} |%{[PSCustomObject](ConvertFrom-StringData -StringData $_)}
ForEach($Connection in $SiteObjects){ 
    $svr = $Connection.DBServer.Trim() 
    $db  = $Connection.DBName.Trim() 
    $uid = $Connection.Username.Trim() 
    $pwd = $Connection.Password.Trim()
}