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