Powershell While循环检查注册表中的值,然后运行exe文件

Powershell While循环检查注册表中的值,然后运行exe文件,powershell,while-loop,exe,Powershell,While Loop,Exe,我正在尝试编写一个while循环,它将检查注册表中的值并继续检查,直到找到为止。一旦发现,我不想运行位于网络共享上的可执行文件,然后停止循环。到目前为止,我可以让它在注册表中查找值,然后运行可执行文件,但它一直在反复运行可执行文件,我不知道如何让它在运行可执行文件后崩溃 以下是我目前的代码: $regkey = 'HKLM:\Software\WOW6432Node\FolderPath' $name = 'Test' $exists = Get-ItemProperty -Path $regk

我正在尝试编写一个while循环,它将检查注册表中的值并继续检查,直到找到为止。一旦发现,我不想运行位于网络共享上的可执行文件,然后停止循环。到目前为止,我可以让它在注册表中查找值,然后运行可执行文件,但它一直在反复运行可执行文件,我不知道如何让它在运行可执行文件后崩溃

以下是我目前的代码:

$regkey = 'HKLM:\Software\WOW6432Node\FolderPath'
$name = 'Test'
$exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue

While ($true) {
    if (($exists -ne $null) -and ($exists.Lenght -ne 0)) {
        & \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter
        } else {
        Start-Sleep -Seconds 15
        }
    }

提前谢谢

有两件事,第一,最好将其设置为DO{}WHILE{}循环,这样它将被强制执行测试并继续测试直到true,第二,循环将无限期地继续,而不在您的示例中执行任何操作,因为它只是不断地测试当它进入WHILE循环时,
$exists
是否为true。要重新测试
$exists
的真/假状态,您必须在每次运行循环时在循环开始时重新分配它

$regkey = 'HKLM:\Software\WOW6432Node\FolderPath'
$name = 'Test'
$Notdone = $true

DO {
    $exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue

    if (($exists -ne $null) -and ($exists.Lenght -ne 0)) {
        & \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter

    $Notdone = $false
    }
    else {
    Start-Sleep -Seconds 15
    }
} While ($Notdone)

一旦满足了等待的条件,就要停止循环。使用可立即跳转到循环外的下一条语句:

$exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue

While ($true) {
    if (($exists -ne $null) -and ($exists.Length -ne 0)) {
        & \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter
        break
    } else {
        Start-Sleep -Seconds 15
    }
}
顺便说一下,只有在输入循环之前存在注册表值时,上面的循环才会工作;否则它将陷入无限循环中,因为
$的值在循环中永远不会更改。相反,您需要在每次迭代中重新评估条件:

While ($true) {
    $exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue
    if (($exists -ne $null) -and ($exists.Length -ne 0)) {
        & \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter
        break
    } else {
        Start-Sleep -Seconds 15
    }
}
通过在循环外部启动可执行文件并省略
else
分支,可以稍微简化代码:

While ($true) {
    $exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue
    if (($exists -ne $null) -and ($exists.Length -ne 0)) {
        break
    }
    Start-Sleep -Seconds 15
}

& \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter
更简洁但可读性稍差的版本是:

While (($exists = Get-ItemProperty -Path $regkey -Name $name -ErrorAction SilentlyContinue) -eq $null -or $exists.Length -eq 0) {
    Start-Sleep -Seconds 15
}

& \\NETWORKSHARE\FolderName\Executable.exe -parameter -parameter "C:\Program Files (x86)\FolderName\JavaScriptObject.json" -parameter