我有这个文本文件:

[Tabs] 
MAILBOXSEND=1 
MAILBOX=8 
USERS=6 
DOCUMENTS_Q=9 
MED_WEBSERVCALLS_LOA=3 
FCLMNA=1 
INCZOOMFORM=1 
USERSB=1 
USERSB_ONE=1 
DATAPRIV=1 
MED_WEBSERVCALLS=2 
TINVOICES=1 
PORDERS=9 
PORDERSTOTAL=1 
LOGPART=1 
LOGCOUNTERS=1 
PARTMSG=1 
[External Mail] 
Send=Y 
Hostname=Server 
Domain=Domain 
Myemail=My@email.com 
MyName=My Test 
Port=25 
SSL=0 
[Search] 
SUPPLIERS=5,1 
StartButton=1 
Ignore Case=0 
PART=6,1 

我正在 try catch [External Mail] 到下一个 [] Brackets Group 之间的所有文本,

我有这个 Regex 可以完成工作并在 Regex101 中进行了测试,在所有测试之后我发现它在 powershell 中不起作用:

$Text = Get-Content c:\text.txt 
$Text -match '(?s)(?<=\[External Mail\]).*?(?=\[.*?\])' 
or: 
$Text | Select-String '(?s)(?<=\[External Mail\]).*?(?=\[.*?\])' 

没有返回

你知道我错过了什么吗?

谢谢

请您参考如下方法:

看起来您正在解析 .INI 文件。不要试图再次发明轮子,利用 existing code .此解决方案将 .Ini 文件读取为易于使用的嵌套哈希表。

在链接失效的情况下,这是脚本专家存档中的函数:

function Get-IniContent ($filePath) 
{ 
    $ini = @{} 
    switch -regex -file $FilePath 
    { 
        "^\[(.+)\]" # Section 
        { 
            $section = $matches[1] 
            $ini[$section] = @{} 
            $CommentCount = 0 
        } 
        "^(;.*)$" # Comment 
        { 
            $value = $matches[1] 
            $CommentCount = $CommentCount + 1 
            $name = "Comment" + $CommentCount 
            $ini[$section][$name] = $value 
        }  
        "(.+?)\s*=(.*)" # Key 
        { 
            $name,$value = $matches[1..2] 
            $ini[$section][$name] = $value 
        } 
    } 
    return $ini 
} 
 
# Sample usage: 
$i = Get-IniContent c:\temp\test.ini 
$i["external mail"] 
 
Name                           Value 
----                           ----- 
Domain                         Domain 
SSL                            0 
Hostname                       Server 
Send                           Y 
MyName                         My Test 
Port                           25 
Myemail                        My@email.com 
 
$i["external mail"].hostname 
Server 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!