Как только условие, которое вы ожидаете, выполнено, вы хотите прекратить зацикливание. Используйте оператор 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