似乎我忽略了一些简单的事情,但是我仍然在分析文本文件的几种不同方法上继续犯错误。 (在下面的代码中,我使用文本变量而不是文件。)我缺少什么?
要解析(模拟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列为字母,数字或下划线。
谢谢!
答案 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方面的经验是引语混杂,我不知道是否可以使用一个模板来获取测试数据的所有三个变体。 (还有数组)
添加更多模板行以正确获取所有变体会导致错误。