PowerShell - 将正则表达式与 threadjob 输出匹配但不会填充 $matches 变量
PowerShell - matching a regex against threadjob output works but doesn't populate $matches variable
当我从新打开的 PowerShell 控制台 运行 以下脚本时,循环退出,因此显然存在匹配项,但 $matches 变量(因此 $matches.PORT)未填充第一次。当脚本再次 运行 时,它被填充。
./ssh.ps1
$BLOCK = { az webapp create-remote-connection --subscription <MY-SUBSCRIPTION> --resource-group <RESOURCE-GROUP> -n <NAME> }
$global:CONNECTION = Start-ThreadJob -ScriptBlock $BLOCK
$done = 0
$match_string = ".*Opening tunnel on port: (?<PORT>\d{1,5})\b.*"
while ($done -lt 1) {
if ($CONNECTION.HasMoreData)
{
$DATA = Receive-Job $CONNECTION 2>&1
if ($DATA -match $match_string)
{
$port = $matches.PORT
Write-Output "Connection open on port $port."
$done = 1
}
}
}
Write-Output "Loop ended."
exit
PowerShell 控制台的输出是:
PS <LOCAL-DIR>> ./ssh
Connection open on port .
Loop ended.
PS <LOCAL-DIR>> ./ssh
Connection open on port 63182.
Loop ended.
相比之下,当我尝试 运行 执行以下脚本时,$matches 会在第一次 运行 时填充。
./match.ps1
$string1 = "hello, hello, you big beautiful world of wonder!"
$match_str = ".*\b(?<gotcha>world)\b.*"
$done = 0
while ($done -lt 1)
{
if ($string1 -match $match_str)
{
write-output "Matches:"
write-output $matches
$done = 1
}
}
输出:
PS <LOCAL-DIR>> ./match
Matches:
Name Value
---- -----
gotcha world
0 hello, hello, you big beautiful world of wonder!
如果有人能理解为什么在没有填充 $matches 的情况下在第一个脚本中匹配文本,我将非常感激。
P.S。
循环后存在的脚本仅用于调查目的,而不是我的代码实际执行的操作。
P.P.S。
作为参考,az webapp create-remote-connection
的输出在连接延迟后为:
Verifying if app is running....
App is running. Trying to establish tunnel connection...
Opening tunnel on port: 63341
SSH is available { username: root, password: Docker! }
Ctrl + C to close
(每次端口不同。)
如果 automatic $Matches
variable isn't populated after a -match
操作,则意味着 LHS 操作数是 集合 而不是 单个字符串 。
因此,循环 $DATA
的值并分别匹配每一行:
foreach ($line in $DATA) {
if ($line -match $match_string)
{
$port = $matches.PORT
"Connection open on port $port."
$done = 1
break
}
}
按设计:
$Matches
仅当 LHS 是 string(标量)时才填充。
- 使用 collection(数组)作为 LHS,
-match
- 与许多比较运算符一样 - 充当 filter 和 returns(可能为空)匹配元素的子数组。
- 任何 prior
$Matches
值是 preserved if either a given string -scalar -match
操作碰巧找不到匹配 or 它的 LHS 是一个 collection.
当我从新打开的 PowerShell 控制台 运行 以下脚本时,循环退出,因此显然存在匹配项,但 $matches 变量(因此 $matches.PORT)未填充第一次。当脚本再次 运行 时,它被填充。
./ssh.ps1
$BLOCK = { az webapp create-remote-connection --subscription <MY-SUBSCRIPTION> --resource-group <RESOURCE-GROUP> -n <NAME> }
$global:CONNECTION = Start-ThreadJob -ScriptBlock $BLOCK
$done = 0
$match_string = ".*Opening tunnel on port: (?<PORT>\d{1,5})\b.*"
while ($done -lt 1) {
if ($CONNECTION.HasMoreData)
{
$DATA = Receive-Job $CONNECTION 2>&1
if ($DATA -match $match_string)
{
$port = $matches.PORT
Write-Output "Connection open on port $port."
$done = 1
}
}
}
Write-Output "Loop ended."
exit
PowerShell 控制台的输出是:
PS <LOCAL-DIR>> ./ssh
Connection open on port .
Loop ended.
PS <LOCAL-DIR>> ./ssh
Connection open on port 63182.
Loop ended.
相比之下,当我尝试 运行 执行以下脚本时,$matches 会在第一次 运行 时填充。
./match.ps1
$string1 = "hello, hello, you big beautiful world of wonder!"
$match_str = ".*\b(?<gotcha>world)\b.*"
$done = 0
while ($done -lt 1)
{
if ($string1 -match $match_str)
{
write-output "Matches:"
write-output $matches
$done = 1
}
}
输出:
PS <LOCAL-DIR>> ./match
Matches:
Name Value
---- -----
gotcha world
0 hello, hello, you big beautiful world of wonder!
如果有人能理解为什么在没有填充 $matches 的情况下在第一个脚本中匹配文本,我将非常感激。
P.S。 循环后存在的脚本仅用于调查目的,而不是我的代码实际执行的操作。
P.P.S。
作为参考,az webapp create-remote-connection
的输出在连接延迟后为:
Verifying if app is running....
App is running. Trying to establish tunnel connection...
Opening tunnel on port: 63341
SSH is available { username: root, password: Docker! }
Ctrl + C to close
(每次端口不同。)
如果 automatic $Matches
variable isn't populated after a -match
操作,则意味着 LHS 操作数是 集合 而不是 单个字符串 。
因此,循环 $DATA
的值并分别匹配每一行:
foreach ($line in $DATA) {
if ($line -match $match_string)
{
$port = $matches.PORT
"Connection open on port $port."
$done = 1
break
}
}
按设计:
$Matches
仅当 LHS 是 string(标量)时才填充。- 使用 collection(数组)作为 LHS,
-match
- 与许多比较运算符一样 - 充当 filter 和 returns(可能为空)匹配元素的子数组。 - 任何 prior
$Matches
值是 preserved if either a given string -scalar-match
操作碰巧找不到匹配 or 它的 LHS 是一个 collection.