如何解析字符串 - 我尝试了下面的代码,但没有正确的结果

时间:2015-07-29 17:12:45

标签: string parsing powershell

我有以下字符串,我尝试了以下分割机制来获取日期和帐户状态,但我认为我的分割或索引已关闭。

Write-host $result
@{AccountExpirationDate=1/23/2016 6:00:00 PM; userAccountControl=512}
$aed =($result -split '=')[0].substring(3)
write-host $aed
ccountExpirationDate - This should be 1/23/2016 6:00:00 PM

$aStatus =($result -split '=')[1].substring(3)
Write-host $aStatus
It should show 512 but it doesn't

===发布原始代码后添加=== 我尝试了下面的代码,它的工作方式有一半。我瘦我需要使用$ rightpath

启动相同的方法来获得分割日期和512
PS C:\> $position = $result.indexof("=")
PS C:\> $rightpart = $result.substring($position+1)
PS C:\> write-host $rightpart
1/23/2016 6:00:00 PM; userAccountControl=512}
PS C:\>

1 个答案:

答案 0 :(得分:1)

您的拆分操作不会按照您的想法执行。 $result -split '='=处的字符串拆分为3部分:

@{AccountExpirationDate
1/23/2016 6:00:00 PM; userAccountControl
512}

索引访问[0]选择这些部分中的第一个(@{AccountExpirationDate),.Substring(3)返回第4个字符(索引从0开始)到结尾的子字符串。字符串:

ccountExpirationDate

其他拆分操作相同。索引[1]从同一个数组中选择第二个元素(1/23/2016 6:00:00 PM; userAccountControl),.Substring(3)返回第4个字符(索引从0开始)到该字符串结尾的子字符串:

3/2016 6:00:00 PM; userAccountControl

演示:

PS C:\> $result = "@{AccountExpirationDate=1/23/2016 6:00:00 PM; userAccountControl=512}"
PS C:\> $result
@{AccountExpirationDate=1/23/2016 6:00:00 PM; userAccountControl=512}
PS C:\> $a = $result -split '='
PS C:\> $a
@{AccountExpirationDate
1/23/2016 6:00:00 PM; userAccountControl
512}
PS C:\> $a[0].Substring(3)
ccountExpirationDate
PS C:\> $a[1].Substring(3)
3/2016 6:00:00 PM; userAccountControl

如果$result实际上是字符串而不是哈希表,则应从字符串的开头和结尾删除@{}

$result -replace '^@{|}$'

以分号拆分以将键/值对彼此分开,然后拆分=处的每个键/值对,以便将键与值分开。

$pair1, $pair2  = $result -replace '^@{|}$' -split '; '
$null, $aed     = $pair1 -split '=', 2
$null, $aStatus = $pair2 -split '=', 2

-split运算符的第二个参数确保第一个=之后的所有内容都进入第二个元素,即使它包含另一个=个字符。赋值左侧的$null会丢弃拆分操作返回的数组的第一个元素(键名)。

演示:

PS C:\> $result = "@{AccountExpirationDate=1/23/2016 6:00:00 PM; userAccountControl=512}"
PS C:\> $result
@{AccountExpirationDate=1/23/2016 6:00:00 PM; userAccountControl=512}
PS C:\> $pair1, $pair2 = $result -replace '^@{|}$' -split '; '
PS C:\> $null, $aed = $pair1 -split '=', 2
PS C:\> $null, $aStatus = $pair2 -split '=', 2
PS C:\> $aed
1/23/2016 6:00:00 PM
PS C:\> $aStatus
512