【问题标题】:Capture specific text from output into a variable将输出中的特定文本捕获到变量中
【发布时间】:2023-04-02 07:38:01
【问题描述】:

我正在尝试编写一个脚本来检测设备插入的 COM 端口,然后将其映射到新端口。

这是“更改端口”命令的输出:

PS C:\> change port
COM11 = \Device\19H2KP0
COM2 = \Device\Serial1
COM5 = \Device\Serial2
KEYSPAN#*USA19HMAP#00_00#{4d36e978-e325-11ce-bfc1-08002be10318} = \Device\ComUs19H-00
KEYSPAN#*USA19HMAP#00_00#{86e0d1e0-8089-11d0-9ce4-08003e301f73} = \Device\ComUs19H-00
USA19HP0 = \Device\19H2KP0

我需要在 "\Device\19H2KP0" 之前捕获 COM 号。所以在这个示例输出中,我会将 COM11 捕获到一个变量中。

接下来我需要使用该变量运行“更改端口”命令。即:

change port COM1=$CapturedText

提前感谢您的帮助!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您是否已经知道19H2KP0 位是什么?如果是这样,您可以使用正则表达式通过前瞻来检测唯一 ID。

    这是一个完整的示例,使用您的示例文本:

    $Output = @"
    COM11 = \Device\19H2KP0
    COM2 = \Device\Serial1
    COM5 = \Device\Serial2
    KEYSPAN#*USA19HMAP#00_00#{4d36e978-e325-11ce-bfc1-08002be10318} = \Device\ComUs19H-00
    KEYSPAN#*USA19HMAP#00_00#{86e0d1e0-8089-11d0-9ce4-08003e301f73} = \Device\ComUs19H-00
    USA19HP0 = \Device\19H2KP0
    "@
    
    $Output -match "COM[0-9]{1,2}(?=.*$Id)";
    
    Write-Host -Object ('COM port is: {0}' -f $matches[0]);
    

    现在这里是示例,使用内联命令:

    $Id = '19H2KP0';
    $Output = change port;
    $Output -match "COM[0-9]{1,2}(?=.*$Id)";
    Write-Host -Object ('COM port is: {0}' -f $matches[0]);
    

    结果

    COM port is: COM11
    

    【讨论】:

    • 所以脚本明确地根据 $Id 检测到正确的字符串,但我收到以下错误:COM7 = \Device\19H2KP0 Cannot index into a null array. At line:4 char:1 + Write-Host -Object ('COM port is: {0}' -f $matches[0]); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArray
    • 该错误意味着$matches 变量没有被填充。正则表达式一定不起作用……新示例中的输出是什么?你能用新的例子更新你的问题吗?
    【解决方案2】:

    更长,但也许更直观,您还可以使用链式 -match 和 -replace 运算符与更简单的正则表达式:

    $CapturedText = (change port) -match 'COM.+19h2kp0' -replace '^(COM\d+).+','$1'
    $CapturedText
    

    【讨论】:

    • 嘿,谢谢!这似乎完美无缺。现在我在运行命令时遇到问题:“从变量更改端口 COM1=COM7”。该文本似乎执行得很好,但实际上并没有运行 DOS 命令“更改端口”。 $ComNum = (change port) -match 'COM.+19h2kp0' -replace '^(COM\d+).+','$1' change port COM1=) + $ComNum $changeport
    • 糟糕,代码搞砸了。 $ComNum = (change port) -match 'COM.+19h2kp0' -replace '^(COM\d+).+','$1' $changeport = (change port COM1=) + $ComNum $changeport
    猜你喜欢
    • 2019-04-10
    • 2010-09-15
    • 2010-10-11
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2011-10-13
    相关资源
    最近更新 更多