如何使用Powershell执行循环以检查匹配字符串?

如何使用Powershell执行循环以检查匹配字符串?,powershell,Powershell,我有一个INI文件。我想将字符串与INI文件中的节点匹配。 我想循环检查字符串。 我尝试了这个,但是我发现了一个问题,虽然它不匹配,但它会循环,但是当我用我想要匹配的字符串修改INI文件匹配时,它仍然会循环,并且不能为结果返回true。 这是INI文件的外观 [State] downloadstage=123 function CPTGM { Write-Host "Capturing" } function Check_Stage { $INI_Path = "D:\FIL

我有一个INI文件。我想将字符串与INI文件中的节点匹配。 我想循环检查字符串。 我尝试了这个,但是我发现了一个问题,虽然它不匹配,但它会循环,但是当我用我想要匹配的字符串修改INI文件匹配时,它仍然会循环,并且不能为结果返回true。 这是INI文件的外观

[State]
downloadstage=123

function CPTGM {
    Write-Host "Capturing"
}

function Check_Stage {
    $INI_Path = "D:\FILE.ini"
    $INI_File = @{}
    Get-Content $INI_Path | ForEach-Object {
        $_.Trim()
    } | Where-Object {
        $_ -notmatch '^(;|$)'
    } | ForEach-Object {
        if ($_ -match '^\[.*\]$') {
            $section = $_ -replace '\[|\]'
            $INI_File[$section] = @{}
        } else {
            $key, $value = $_ -split '\s*=\s*', 2
            $INI_File[$section][$key] = $value
        }
    }
    $String = "123"
    $n = 0
    while (-not ($INI_File["State"]["downloadstage"] -eq "$String")) {
        Start-Sleep -s 1
        $n++
        Write-Host "Attempt no $n"
    }

    Write-Host ">>String found after $n attempts"
    Write-Output "Continue to Capture"
    CPTGM
}

Check_Stage

问题是您只读取了一次*.ini文件,并在
while
循环的每次迭代中测试相同的固定内容。如果第一次出现搜索字符串,它将立即退出while循环,但如果第一次不出现,它将不会再次读取文件以查看是否已更改

您需要在while循环中移动“read ini file”代码,以便每次刷新
$ini_文件
,并获取外部程序所做的任何更改

此外,您可以使用devblogs.microsoft.com中的此函数解析ini文件,然后查询结构化结果,而不是自己刮取ini文件

函数获取内容($filePath)
{
$ini=@{}
switch-regex-file$FilePath
{
“^\[(.+)\]”节
{
$section=$matches[1]
$ini[$section]=@{}
$CommentCount=0
}
“^(;*)$”注释
{
$value=$matches[1]
$CommentCount=$CommentCount+1
$name=“Comment”+$CommentCount
$ini[$section][$name]=$value
} 
“(.+?)\s*=(.*)”键
{
$name,$value=$matches[1..2]
$ini[$section][$name]=$value
}
}
返回$ini
}
您的
检查阶段
会变成:

功能检查\u阶段{
$INI\u Path=“D:\FILE.INI”
$INI_文件=获取IniContent$INI_路径#使用获取IniContent而不是您自己的版本
$String=“123”
$n=0
而(-not($INI_File.State.downloadstage-eq$String)){
开始睡眠-s1
$n++
写入主机“尝试号$n”
$INI_File=获取IniContent$INI_路径#再次读取INI文件以获取任何更改
}
写入主机“>>尝试$n次后发现的字符串”
写入输出“继续捕获”
CPTGM
}

当我刚刚测试它时,代码对我有效。请回答您的问题并展示示例输入。您如何测试它?当INI文件不包含$String时,它不起作用,然后我修改了INI文件中的字符串,但它不能匹配字符串。它返回此
第26次尝试第27次尝试……
我必须停止它,然后再次运行scirpt,然后它匹配。谢谢@mclayton,你是最好的!!