Array的ConvertFrom-Sting模板解析失败

时间:2018-10-16 12:36:23

标签: string powershell

似乎我忽略了一些简单的事情,但是我仍然在分析文本文件的几种不同方法上继续犯错误。 (在下面的代码中,我使用文本变量而不是文件。)我缺少什么?

要解析(模拟TXT数据文件)的文本为:

$testText = @'

FolderName User                  AccessRights                                            
---------- ----                  ------------                                            
Calendar   Mickey Mouse          {Reviewer}                                              
Calendar   Donald Duck           {AvailabilityOnly}                                      
Calendar   Minnie Mouse-Ears     {Editor}                                                
Calendar   Scrooge McDuck        {Editor}                                                
Calendar   Pluto B. Dog          {LimitedDetails}                                        
Calendar   Roscoe Pico Train     {Reviewer}                                              
Calendar   Uncle Boss Hogg       {ReadItems, EditOwnedItems, EditAllItems, FolderVisible}



FolderName                             User                  AccessRights
----------                             ----                  ------------
{A9E2BC46-B3A0-4243-B315-60D991004455} Mickey Mouse          {None}      
{A9E2BC46-B3A0-4243-B315-60D991004455} Donald Duck           {None}      
{A9E2BC46-B3A0-4243-B315-60D991004455} Pluto B. Dog          {None}      



FolderName   User                  AccessRights
----------   ----                  ------------
GAL Contacts Mickey Mouse          {None}      
GAL Contacts Donald Duck           {None}      
GAL Contacts Minnie Mouse-Ears     {None}      
GAL Contacts Pluto B. Dog          {None}      



'@

我尝试过的模板(有很多变化)如下:

$template = @'

FolderName User            AccessRights
---------- ----            ------------
{[string]Folder*:Calendar}   {[string]User:Mickey Mouse} {[array]FolderPermissions:{Reviewer}}
'@

最后,执行的命令将是:

$testText | ConvertFrom-String -TemplateContent $template -OutVariable sharedMailboxPermissions | Out-Null

错误显示为:

ConvertFrom-String:提供的模板无效:在处理从第4行第84列开始的Span时,名称字符必须在第4行第94列为字母,数字或下划线。

谢谢!

3 个答案:

答案 0 :(得分:3)

应避免弯曲括号。以下应该起作用:

$testText | ConvertFrom-String -TemplateContent @'
{Folder*:Calendar} {User:Mickey Mouse} {FolderPermissions:\{Reviewer\}}
{Folder*:Calendar} {User:Uncle Boss Hogg} {FolderPermissions:\{ReadItems, EditOwnedItems, EditAllItems, FolderVisible\}}
{Folder*:\{A9E2BC46-B3A0-4243-B315-60D991004455\}} {User:Mickey Mouse} {FolderPermissions:\{None\}}
'@

结果

Folder                                 User                       FolderPermissions                                       
------                                 ----                       -----------------                                       
Calendar                               Mickey Mouse               {Reviewer}                                              
Calendar                               Donald Duck                {AvailabilityOnly}                                      
Calendar                               Minnie Mouse-Ears          {Editor}                                                
Calendar                               Scrooge McDuck             {Editor}                                                
Calendar                               Pluto B. Dog               {LimitedDetails}                                        
Calendar                               Roscoe Pico Train          {Reviewer}                                              
Calendar                               Uncle Boss Hogg            {ReadItems, EditOwnedItems, EditAllItems, FolderVisible}
{A9E2BC46-B3A0-4243-B315-60D991004455} Mickey Mouse               {None}                                                  
{A9E2BC46-B3A0-4243-B315-60D991004455} Donald Duck                {None}                                                  
{A9E2BC46-B3A0-4243-B315-60D991004455} Pluto B. Dog               {None}                                                  
GAL                                    Contacts Mickey Mouse      {None}                                                  
GAL                                    Contacts Donald Duck       {None}                                                  
GAL                                    Contacts Minnie Mouse-Ears {None}                                                  
GAL                                    Contacts Pluto B. Dog      {None}

答案 1 :(得分:0)

您在上面看到的特定错误是因为您在比赛中使用了花括号。您可以通过使用\进行转义来解决此问题,但我认为这样做不一定会使您的代码充分发挥作用。

很遗憾,我认为您的输入文件太复杂/结构太多,无法由ConvertFrom-String处理。但是,这是一个替代解决方案,它使用一些正则表达式和字符串拆分来获取我认为您需要的输出:

$UserIndex = 0
$AccessIndex = 0

$Results = ForEach ($Line in $testText -split "`n") {

    If ($Line -match '^FolderName') {
        $UserIndex = $Line.IndexOf('User')
        $AccessIndex = $Line.IndexOf('AccessRights')
    }

    If ($Line -notmatch '^FolderName|^$|^---------') {
       [PSCustomObject]@{
            FolderName   = $Line.SubString(0,$UserIndex).Trim()
            User         = $Line.SubString($UserIndex,($AccessIndex - $UserIndex)).Trim()
            AcccssRights = $Line.SubString($AccessIndex).Trim()
       }
    }
}

$Results

这一次循环遍历文本,并查找以“ FolderName”开头的行。如果找到该行,它将在该行中查找“ User”和“ AccessRights”,并捕获这些字符串出现的索引。

然后,我们使用该索引在后续各行中查找数据。这里还有另一个正则表达式,用于过滤以“ FolderName”开头的行,空行(通过使用RegEx $^)和以“ ---------”开头的行。如果不是这些行之一,那么我们将返回一个PowerShell对象,其中包含每个数据的属性,这些属性是通过使用我们先前确定的索引来找到的。

请注意,这可以与您提供的输入一起使用,但是会做出许多假设,即数据将始终是这种方式。

根据注释,PowerShell确实使用默认的Format-Table类型视图在输出原始文件。当然,将源的输出更改为易于处理的内容(例如Export-CSV)是最容易的。

答案 2 :(得分:0)

  • 模板中引用示例数据的花括号必须用反斜杠filter.IncludedListB = ''BAR','BSO'';

  • 进行转义
  • 使用\{Reviewer\}和复杂的不同样本数据时,您将需要多个样本行,请参见this link

使用此模板:

*

我得到以下示例输出:

$template = @'

FolderName User            AccessRights
---------- ----            ------------
{[string]Folder*:Calendar}   {[string]User:Mickey Mouse} {[string]FolderPermissions:\{Reviewer\}}
{[string]Folder*:Calendar}   {[string]User:Uncle Boss Hogg}       {[string]FolderPermissions:\{ReadItems, EditOwnedItems, EditAllItems, FolderVisible\}}                                      
'@

$testText | ConvertFrom-String -TemplateContent $template 

我自己在cfs方面的经验是引语混杂,我不知道是否可以使用一个模板来获取测试数据的所有三个变体。 (还有数组)

添加更多模板行以正确获取所有变体会导致错误。