Parsing powershell和字符串从非结构化文本到哈希表
我试图从这些输出中找到两个变量的最佳解决方案:Parsing powershell和字符串从非结构化文本到哈希表,parsing,powershell,hashtable,Parsing,Powershell,Hashtable,我试图从这些输出中找到两个变量的最佳解决方案: Backup server1_incr Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-10 Backup server2_incr Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 196
Backup server1_incr Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-10
Backup server2_incr Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-10
Backup vea server3_d4d Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-10
Backup ae server4011_d2d Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-10
Backup server6_incr Completed incr 1/15/2014 6:00:06 PM 0:00 0:04 0.84 1 0 0 19672 100% 2014/01/15-9
我只需要每行中的两个项目-从第2列(服务器1 incr;ae服务器4011_d2d…)到最后一列(2014/01/15-10;2014/01/15-9)结束。
解析行字符串后,将存储在hashtab中的值,以便进行其他处理:
key value
server1_incr 2014/01/15-10
server2_incr 2014/01/15-10
ae server4011_d2d 2014/01/15-10
有什么想法吗?两个晚上没有睡觉,也不知道,我没有电了。谢谢
一个小时的睡眠是个好主意:)现在多睡几分钟,我有了密码——我知道,糟糕。。。但对于基地
$srvIDht = @{}
$inputData = Get-Content "c:\scripts\DPout"
foreach ($line in $inputData) {
$inline = $line
([regex]::match($inline,"(?<=Backup)[^/]+(?=Completed)").Value).ToString().Trim() | foreach { $srv = ($_) }
([regex]::match($inline,"(?<=%\s).*").Value).ToString().Trim() | foreach { $bID = ($_) }
$srvIDht.$srv += @( "$bID" )
}
$srvIDht=@{}
$inputData=获取内容“c:\scripts\DPout”
foreach($inputData中的行){
$inline=$line
([regex]::match($inline),(?如果文本在文件C:\Temp\data.txt
中,您可以尝试:
$a = Get-Content C:\Temp\data.txt
$b = $a | % {@{$($_.substring(9,18))=$($_.substring(110,13))}}
$b
Name Value
---- -----
server1_incr 2014/01/15-10
server2_incr 2014/01/15-10
vea server3_d4d 2014/01/15-10
ae server4011_d2d 2014/01/15-10
server6_incr 2014/01/15-9
您可以修剪键和值。这是一个使用正则表达式的版本,并保持哈希表与输入的顺序相同。如果您没有使用至少版本3的powershell,请删除第一行和第三行的[ordered]标记:
#requires -version 3.0
$lines = get-content "F:\scripts\text2ht\datafile"
$hashTable = [ordered]@{}
foreach ( $line in $lines ) {
if ($line -cmatch '^Backup\s+(.+?)\s+Completed.*%\s+(.*?)$') {
$key = $matches[1]
$value = $matches[2]
$hashTable.Add( $key, $value )
}
}
$hashTable
这与omnirpt的输出惊人地相似(尽管在我的服务器上间隔不同)。如果您想捕获SessionID,即使备份没有成功完成,也可以将cmatch更改为类似以下内容:
'^Backup\s+(.+?)\s+(?:Completed|Failed|In Progress).*%\s+?(.*?)\s*$'
在我的测试用例中,它捕获了已完成、已完成/错误、失败和正在进行的状态。睡一觉。从经验来看,这肯定会有帮助。测试我自己-100%有效:)是什么分隔了列?是制表符吗?你尝试过什么不起作用?我假设你已经知道如何创建哈希表,所以你只需要这一部分:。@zdan:要么是那个,要么是固定长度。请看我上面的评论。