PowerShell检测软件未安装时创建计划任务执行安装脚本问题求助
核心问题出在判断逻辑错误
你代码里给$installed32赋值的语句末尾带了-ne $null,这会让这个变量最终的取值是布尔值($true代表检测到已安装,$false代表未检测到),不可能等于$null,所以If ($installed32 -eq $null)这个判断条件永远不会触发,计划任务当然不会创建。
其他需要修正的问题
- 你用了
-Like匹配但是没有加通配符,和直接用-eq效果完全一致,如果要做模糊匹配建议改成"*$software*";如果是精确匹配直接换-eq逻辑更清晰 - 目前只检测了32位程序的注册表路径,缺少64位程序的检测逻辑,64位系统下如果安装的是64位版本的软件会出现漏判
- 注册计划任务的时候可以直接传入
-Principal参数和密码,不需要再额外调用Set-ScheduledTask修改,减少冗余操作
修正后代码
$software = "Screen Capture Module - 15.2.8.747"; # 同时检测32位和64位注册表路径 $paths = @( "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" ) $installed = $false foreach ($path in $paths) { $match = Get-ItemProperty -Path $path -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -eq $software } if ($null -ne $match) { $installed = $true break } } $taskName = "ScreenCaptureInsScript" $taskAction = New-ScheduledTaskAction -Execute 'C:\XXXXXX\Verint-SC\Install-script.bat' $taskTrigger = New-ScheduledTaskTrigger -Once -At 7:00 $taskPrincipal = New-ScheduledTaskPrincipal -UserId "XXXXXXX\XXXXXXXX" -RunLevel Highest $taskSettings = New-ScheduledTaskSettingsSet ` -Compatibility Win8 ` -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries ` -StartWhenAvailable # 未检测到安装时执行注册操作 If (-not $installed) { # 直接注册时传入所有参数,不需要后续修改 Register-ScheduledTask ` -TaskName $taskName ` -Action $taskAction ` -Trigger $taskTrigger ` -Description "Verint Screen Capture Installation Script Task" ` -Settings $taskSettings ` -Principal $taskPrincipal ` -User $taskPrincipal.UserID ` -Password 'xxXxxxXXXXx' ` -Force }
调试的时候可以先单独输出$installed变量的值,确认检测逻辑是否符合预期,再跑完整流程。
内容的提问来源于stack exchange,提问作者Dezirdt Uzurnaim
相关产品推荐
相关产品推荐

