2016-03-04 114 views
1

我正在寻找一种方法来查找文件中的字符串后提取字符串,然后提取该字符串和分离器之间的一切。我能得到LINE出来的文件,但我如何得到我想要离开它的字符串有点难倒。PowerShell来寻找另一个字符串

线出来的文件是这样的:

<add key="ConnectionString" value="Data Source=xxxxxx;Initial Catalog=Database;Integrated Security=True" /> 

我能找到的“数据源=”,但我想回到“XXXXXX”。以下是我正在使用的:

((Get-Process -Name "db-engine").Path) + '.Config' | Select-String -Path {$_} - Pattern 'Data Source=' 

这给了我从上面的整个“添加键”行。

在此先感谢您的帮助!

编辑:感谢您的答复。做多一些挖后,它看起来像“更正确”的方式实际上是用[XML]在文件的内容拉成一个XML对象。然后我可以获取值并使用split将数据分解成我需要的块。最终的代码将如下所示:

$configpath  = ((Get-Process -Name "db-engine").Path) 
$linepath  = $configpath + ".Config" 
[xml]$xmlfile = get-content $linepath 
$xmlvalue  = ($xmlfile.configuration.appSettings.add | where {$_.key -eq "ConnectionString"}).value 
$server   = $xmlvalue.split(";=")[3] 
$db    = $xmlvalue.split(";=")[5] 

仍然在研究结果,但这似乎让我走上了正确的道路。 Split将输入分解为一个数组,所以[x]让我调用一个特定的元素。在分割中有多个分隔符,它会在任何分隔符处打断输入。也许这可以帮助未来的其他人。

感谢所有帮助,伙计们!

回答

2

个人而言,我刚刚得到的属性值 - 可能与选择的XML的XQuery - 再拆它的分号,然后用ConvertFrom-StringData

$xml = [xml]'<add key="ConnectionString" value="Data Source=xxxxxx;Initial Catalog=Database;Integrated Security=True" />'; 
$ConnectionString = ($xml | Select-Xml -XPath '/add[@key="ConnectionString"]/@value').Node.'#text' 
$DataSource = ($ConnectionString.Split(';') | ConvertFrom-StringData).'Data Source' 
+0

我在解决方案中使用了这些元素。我将它添加到编辑后的文章中。谢谢! –

2

我同意@培根位 - 如果您有一个xml文件,那么您可能会考虑将其视为这样。如果你想使用Select-String,你可以使用MatchInfo的捕获组。使用命名组的示例:

gc .\dataSource.txt | Select-String -Pattern 'Data Source=(?<ds>.+?);' | % { $_.Matches[0].Groups['ds'].Value } 
+0

这是一个有趣的方法。我会继续记住这一点。谢谢! –

相关问题