Powershell Form监听wsusutil.exe执行完成后执行后续任务方案
问题解决方法
修正后完整代码
$btnStartExport.Add_Click({ $nicedate = get-date -UFormat %m-%d-%y # 按MM-DD-YY格式生成日期 $WSUSUtilPath = "c:\Program Files\Update Services\Tools\" $WSUSMetaDataPath = "c:\tools\wsusexport\" $isotitle = "WSUS Offline Server update $nicedate" $isofilename = "WSUSSvrOffline-$nicedate.iso" $isoFullPath = Join-Path -Path $txtISOLocation.Text -ChildPath $isofilename # 正确拼接ISO输出路径 # Step1 检查目录是否存在 Check-Path $WSUSMetaDataPath # Step2 导出WSUS元数据 try { $wsusProcess = Start-Process -FilePath "$WSUSUtilPath\WsusUtil.exe" ` -ArgumentList @("export","$WSUSMetaDataPath\$nicedate-export.xml.gz","$WSUSMetaDataPath\$nicedate-export.log") ` -WindowStyle Hidden ` -Wait ` -PassThru ` -ErrorAction Stop } catch { # 可在此处添加启动进程失败的提示逻辑 Write-Error "启动WsusUtil失败:$_" return } # 可选:判断导出是否成功 if ($wsusProcess.ExitCode -ne 0) { # 可在此处添加导出失败的提示逻辑 Write-Error "WSUS元数据导出失败,退出码:$($wsusProcess.ExitCode)" return } # Step3 生成ISO文件 Get-ChildItem "$WSUSMetaDataPath", $txtWSUSContentPath.Text | New-IsoFile -Path $isoFullPath -Force -Title $isotitle # Step4 清理元数据目录 Get-ChildItem -Path $WSUSMetaDataPath -Include *.* -File -Recurse | ForEach-Object { $_.Delete() } }) $frmMain.controls.add($btnStartExport)
两个问题的具体解决方案
1、监听wsusutil.exe运行结束再执行后续操作
你之前用do-until逻辑出现重复启动进程的问题,是因为把Start-Process写在了循环体内,每次循环都会重新启动一次程序。
正确实现不需要自己写循环监听:
- 使用
Start-Process自带的-Wait参数,执行后会自动阻塞当前线程直到目标进程退出,后续代码会自动在进程结束后运行 - 搭配
-PassThru参数可以拿到进程对象,通过ExitCode属性可以判断导出操作是否执行成功,避免导出失败还继续生成无效ISO
2、-NoNewWindow参数仍然弹出黑框
-NoNewWindow仅对当前PowerShell会话拉起的子控制台程序有效,wsusutil作为系统内置工具会忽略该参数,要完全隐藏窗口只需替换参数即可:
- 去掉
-NoNewWindow,改用-WindowStyle Hidden直接设置进程窗口为隐藏状态 - 你代码里已经把日志输出通过参数传给了wsusutil,不会有额外输出触发窗口弹出,修改后不会再出现黑框
其他修复说明
- 修正了原代码中
SilentyContinue的拼写错误(正确为SilentlyContinue,本次优化方案中改用try-catch捕获启动异常) - 改用
Join-Path拼接ISO输出路径,避免手动拼接出现路径分隔符缺失的问题
内容的提问来源于stack exchange,提问作者cstewart28
相关产品推荐
相关产品推荐

