字符串 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()
}
我有一个阅读的文本文件,我需要从中获取值。
示例文本文件:
[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()
}