gpt4 book ai didi

regex - 解析文件夹中的脚本文件,并在Powershell + RegEx中标记多行字符串

转载 作者:行者123 更新时间:2023-12-03 00:02:54 31 4
gpt4 key购买 nike

另一个PowerShell + RegEx困境。
试图解析包含脚本文件的文件夹/目录。找到包含变量设置的脚本,并输出脚本文件名以及分配给变量的值。

我看到的规则是:

  • 所需的步骤将始终以MVL开头,它可能是也可能不是
    前面有1个或多个空格。
  • 该步骤以冒号(;)结尾。
  • 分配的值以',
  • 结尾
  • 需要显示脚本中所有MVL步骤的变量值。

  • 我需要捕获的是脚本文件的名称,以及变量 SRCFILESERVERTARGETFILE的值。

    我正在寻找的数据将是这样的:

    MVL       SRCFILE='\PATH\FOLDER\FILENAME.TXT   ',SERVER='SERVERNAME             ',
    TARGETFILE='TARGET.TXT ',PARM1=O,PARM2=N,PARM3=N,PARM4=Y,PARM5=N,PARM6=' ',
    PARM7=N,PARM8='NONE ',PARM8=' ',
    PARM9=00;
    Other lines I don't care about

    Could be blank lines
    * Comment lines will begin with asterisk, need to skip
    MVL SRCFILE='\PATH\FOLDER2\FILENAME'&1'.TXT ',
    SERVER='SERVERNAME2 ',
    TARGETFILE='TARGET2.TXT ',PARM1=O,PARM2=N,PARM3=N,PARM4=Y,PARM5=N,PARM6=' ',
    PARM7=N,PARM8='NONE ',PARM8=' ',
    PARM9=00;


    我从RegEx模式开始,但现在全神贯注。我知道这仅从指定的文件读取数据。

    我最新的是这个,但是我无法让它在连续的行中查找并捕获所需的值:
    Select-String -Pattern "(?:^[\s]*?MVL\s*?SRCFILE=')(.*)(?:\s+?',)(?:.*$)" c:\scripts\Script1.scl

    因此,如果样本数据位于 Script1.scl中,我的输出将类似于:
       Script1.scl    \PATH\FOLDER\FILENAME.TXT       SERVERNAME    TARGET.TXT
    Script1.scl \PATH\FOLDER\FILENAME'&1'.TXT SERVERNAME2 TARGET2.TXT

    最佳答案

    您可以通过两种方式使选择字符串搜索多个文件:

    Select-String -Pattern "..." c:\scripts\*.sc1

    要么
    Get-ChildItem c:\scripts\*.sc1 -recurse | Select-String -Pattern "..."

    现在,它正在搜索找到匹配的多个文件,它将输出具有以下属性的MatchInfo对象:
       TypeName: Microsoft.PowerShell.Commands.MatchInfo

    Name MemberType Definition
    ---- ---------- ----------
    Equals Method bool Equals(System.Object obj)
    GetHashCode Method int GetHashCode()
    GetType Method type GetType()
    RelativePath Method string RelativePath(string directory)
    ToString Method string ToString(), string ToString(string directory)
    Context Property Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
    Filename Property string Filename {get;}
    IgnoreCase Property bool IgnoreCase {get;set;}
    Line Property string Line {get;set;}
    LineNumber Property int LineNumber {get;set;}
    Matches Property System.Text.RegularExpressions.Match[] Matches {get;set;}
    Path Property string Path {get;set;}
    Pattern Property string Pattern {get;set;}

    您可以像这样提取文件名和正则表达式捕获组:
    Select-String -Pattern "..." c:\scripts\*.sc1 | Select Filename,
    @{n='ServerName';e={$_.matches.groups[1].Value}}

    关于regex - 解析文件夹中的脚本文件,并在Powershell + RegEx中标记多行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790659/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com