【问题标题】:Powershell regex on command output for NLTESTNLTEST 命令输出上的 Powershell 正则表达式
【发布时间】:2013-09-23 22:46:01
【问题描述】:

跑步:

nltest /sc_query:domain /server:servername

生产:

Flags: 30 HAS_IP  HAS_TIMESERV 
Trusted DC Name \\hostname.domain 
Trusted DC Connection Status Status = 0 0x0 NERR_Success
The command completed successfully

我想在 $ 后面加上 \\ 只是“主机名”而已。

到目前为止有:'(?

如何在 PowerShell 中编写代码,以便只获取主机名?

【问题讨论】:

    标签: regex parsing powershell


    【解决方案1】:

    您也可以像这样使用-match 运算符:

    nltest /sc_query:domain /server:servername | Where {$_ -match '\\\\([a-zA-Z0-9_-]+)'} | 
        Foreach {$matches[1]}
    

    【讨论】:

    • 当我得到 hostname.domain 时输出很接近,但我只想要主机名?
    • 非常感谢!您能否解释一下该正则表达式代码是如何工作的,因为我试图让我了解正则表达式并发现它有点令人困惑。
    • \\\\ 是您指定两个反斜杠的方式。由于反斜杠是一个元字符,因此使用它实际上需要用另一个反斜杠对其进行转义。括号是一个捕获组,其匹配的内容放在 $matches[1] 中。 []+ 表示要捕获一个或多个字符,这些字符可以单独指定,也可以使用- 在一个范围内指定,例如 a-zA-Z 指定所有小写和大写字母字符。 0-9 指定所有数字,然后将_- 指定为其他有效字符。
    【解决方案2】:

    你可以使用:

    $output = nltest /sc_query:domain /server:servername
    
    $Hostname = ([regex]::Match($output,'(?<=\\\\).+?(?=\.)')).value
    

    编辑:更新正则表达式以获取主机名。

    (?<=\\\\) = Positive look-behind for the string `\\` (It will start grab characters after the `\\`)  
    .+?        = Any character one or more times
    (?=\.)    = Positive look-ahead (It will only grab characters before a `.`)
    

    编辑 2:意识到我应该让 + 不贪婪,所以它会停在第一个 .。为未来的访问者调整正则表达式。

    【讨论】:

    • 当我运行时,我得到: servername.domain 受信任的 DC 连接状态 Status = 0 0x0 NERR_Success 命令成功完成。我怎样才能得到主机名?
    • 对不起,我虽然你的正则表达式是从问题的功能。我更新了一个有效的正则表达式。它应该抓取\` and the first 之间的所有字符。`如果您想要获取的服务器名称中有任何.,您将需要创建一个更复杂的正则表达式,此时可能会全部抓取并在后面的代码中拆分。
    • 不用担心,不幸的是,当我在 powershell 中运行该代码时,它仍然返回包含主机名和域名的完整行。即 servername.domain
    • 你运行的是什么版本的powershell?如果您不确定如何查看,请使用$PSVersionTable 查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多