Цикл while для проверки реестра на наличие значений и последующего запуска exe-файла - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать цикл 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
        }
    }

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как только условие, которое вы ожидаете, выполнено, вы хотите прекратить зацикливание. Используйте оператор break , чтобы сразу перейти к следующему оператору вне цикла:

$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
    }
}

Кстати, вышеуказанный цикл будет работать только в том случае, если значение реестра существует до того, как цикл будет введен; в противном случае он застрянет в бесконечном цикле, потому что значение $exists никогда не изменится внутри цикла. Вместо этого вам нужно пересмотреть условие на каждой итерации:

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
0 голосов
/ 02 мая 2018

Две вещи, во-первых, было бы лучше сделать это циклом DO {} WHILE {}, чтобы он принудительно проходил тест и продолжал тестирование до истины, а во-вторых, цикл продолжается бесконечно, ничего не делая в вашем примере, потому что он только постоянно проверяет, было ли $exists истинно, когда оно входило в цикл while. Чтобы повторно проверить истинное / ложное состояние $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)
...