我在2008 R2文件服务器上运行以下内容以提取配额信息,因为PS FSRM模块不可用。匹配$RegEx
变量中的字符串时,只要变量中只有2个字符串,就可以正常工作,$matches[1]
和$matches[2]
值按预期添加对象数组,但是当我尝试添加第三次捕获时,或者在这种情况下5次捕获时,我根本没有输出。 $matches
中没有任何内容,$objArr
中没有任何内容。
$RegEx = 'Quota Path:\s+(.*)[\s\S]*?' +
'Source Template:\s+(.*)\s+' +
'Limit:\s+(.*)\s+' +
'Used:\s+(.*)\s+' +
'Available:\s+(.*)'
$objArr = @()
$objArr = (dirquota qu l | Out-String) -replace '\r\n', "`n" -split '\n\n' |
where {$_ -match $RegEx} |
foreach {
New-Object -TypeName psobject -Property ([ordered]@{
QuotaPath = $matches[1]
Template = $matches[2]
QuotaLimit = $matches[3]
Used = $matches[4]
Availble = $matches[5]
})
}
我不能理解的是我可以重新排列捕获并且2的任何组合都可以工作,所以看起来捕获字符串在某种程度上是正确的,但是一旦我尝试添加第3个或更多,我一无所获。我确定我错过了RegEx捕获字符串格式的方式。
dirquota qu l | Out-String
输出一个字符串,如下所示:
... Quota Path: E:\DirA\SubdirA\SubdirA1 Share Path: \\SERVER\SubdirA\SubdirA1 \\SERVER\E\DirA\SubdirA\SubdirA1 \\SERVER\DirA\SubdirA\SubdirA1 Source Template: TemplateA (Matches template) Quota Status: Enabled Limit: 500.00 MB (Hard) Used: 6.00 KB (0%) Available: 499.99 MB Peak Usage: 6.00 KB (4/1/2015 12:27 PM) Thresholds: Warning ( 80%): Event Log Limit (100%): Event Log Quota Path: E:\DirB\SubdirB\SubdirB1 Share Path: \\SERVER\SubdirB\SubdirB1 \\SERVER\E\DirB\SubdirB\SubdirB1 \\SERVER\DirB\SubdirB\SubdirB1 Source Template: TemplateB (Matches template) Quota Status: Enabled Limit: 500.00 MB (Hard) Used: 1.00 KB (0%) Available: 500.00 MB Peak Usage: 1.00 KB (7/12/2016 12:09 PM) Thresholds: Warning ( 80%): Event Log Limit (100%): Event Log ...
答案 0 :(得分:0)
Quota Path
)# https://www.regex101.com/r/3WrfYk/1
$File = ".\quota.txt"
# dirquota qu l | Set-Content $File
$Delimiter = 'Quota Path:'
$Escaped = [regex]::Escape($Delimiter)
$Split = "(?!^)(?=$Escaped)"
$RegEx = '(?smi)^Quota Path:\s+(?<QuotaPath>.*?)$.*?' `
+ '^Source Template:\s+(?<Template>.*?)$.*?' `
+ '^Limit:\s+(?<QuotaLimit>.*?)' `
+ 'Used:\s+(?<Used>.*?)$.' `
+ 'Available:\s+(?<Available>.*?)$.'
$objArr = @()
$objArr = ((Get-Content $File -Raw) -split $Split)|
foreach {
if ($_ -match $RegEx) {
New-Object -TypeName psobject -Property (
[ordered]@{ QuotaPath = $matches.QuotaPath
Template = $matches.Template
QuotaLimit = $matches.QuotaLimit
Used = $matches.Used
Availble = $matches.Availble
})
} # if
} # foreach
$objArr|select QuotaPath,Template,QuotaLimit,Used,Available|out-gridview
答案 1 :(得分:0)
由于您的正则表达式根本不匹配,因此您无法获得所需的结果。在SourceTemplate
和Limit
记录之间还有一行,修改后的正则表达式不会解释:
... Quota Path: E:\DirA\SubdirA\SubdirA1 Share Path: \\SERVER\SubdirA\SubdirA1 \\SERVER\E\DirA\SubdirA\SubdirA1 \\SERVER\DirA\SubdirA\SubdirA1 Source Template: TemplateA (Matches template) Quota Status: Enabled Limit: 500.00 MB (Hard) Used: 6.00 KB (0%) Available: 499.99 MB ...
正则表达式的Source Template:\s+(.*)\s+
部分与(子)字符串匹配&#34;源模板:&#34;后跟一个或多个空格字符(\s+
),所有字符的分组匹配,直到(但不包括)下一个换行符((.*)
),以及一个或多个空格字符({{1 }})。但是,由于正则表达式的下一部分为\s+
,因此如果Limit:\s+(.*)\s+
之后的行以Source Template:
开头,则您只能获得匹配。
基本上,模式Limit:
仅匹配:
... \\SERVER\DirA\SubdirA\SubdirA1 Source Template: TemplateA (Matches template) Quota Status: Enabled Limit: 500.00 MB (Hard) ...
当你真正需要它来匹配时:
... \\SERVER\DirA\SubdirA\SubdirA1 Source Template: TemplateA (Matches template) Quota Status: Enabled Limit: 500.00 MB (Hard) ...
要使其包含您需要更改的其他行
Source Template:\s+(.*)\s+
到
'Source Template:\s+(.*)\s+'
字符类'Source Template:\s+(.*)[\s\S]+?'
匹配任何字符而不仅仅是空格字符([\s\S]
),修饰符\s
与一个或多个字符进行非贪婪匹配。这样,表达式包括直到下一次出现的字符串+?
的所有文本。