我有一个我读取的文本文件,我需要从中获取值。
文本文件示例:
[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 连接行中。
除了记录标题之外(即[Site 01]
)其余部分可以通过以下方式处理ConvertFrom-StringData
正好。我们可以将记录转换为直接在标题行上或多或少分割的对象。ConvertFrom-StringData
将多行字符串转换为哈希表,您可以将其转换为[PSCustomObject]
和中提琴,你有易于使用的物品。
$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>
}
Edit:更新我的答案,因为示例文本已更改为添加<pre>
and </pre>
。我们只需要删除这些,并且由于 OP 收到有关 null 值的方法的错误,我们也会过滤 null。
$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()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)