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:要么是那个,要么是固定长度。请看我上面的评论。