首页 > 解决方案 > 用于浏览器进程管理的 PowerShell 一行中的错误

问题描述

我试图在一行中运行 PowerShell 中的代码。此代码是用于监视的循环。如果 Microsoft Edge 已打开,则该过程必须关闭 Chrome。

如果 Edge 没有打开,我的代码运行良好,它在 if 条件下运行,但如果 Edge 被打开,它会在 else 条件下返回一个错误。

系统是带有 PowerShell ISE 的 Windows 10。

$a = 1 ;DO { 'Starting Loop' ; $vischk = get-process | where-object {$_.mainwindowhandle -ne 0 -and $_.MainWindowTitle -eq 'Start - Microsoft Edge'} | select-object name, mainwindowtitle ; if (!($vischk)) {Write-Warning 'Microsoft Edge is off'}else{Write-Warning 'Closing Chrome' Stop-Process -name chrome} ; Write-Warning 'Active surveillance' ; Start-Sleep -s 15} While ($a -le 2)

我需要运行监视窗口,并在打开 Microsoft Edge 时关闭另一个浏览器,例如 chrome 或另一个进程名称。

标签: powershell

解决方案


这也不是 One-Liner,它是一个长脚本,都放在一行上。;-},因此您使用分号。分号表示它之前和之后是独立的代码块。

我在交互式控制台主机中得到了这个用例,但是在脚本中,那是完全不同的事情。

然而,这样做。你拥有它的方式是一种选择。在 ISE 中开发,保存文件,直接从控制台运行或从 ISE 中运行。

此外,您检查 MS Edge 实例的方式也不正确。MainWindowTitle 只是“Microsoft Edge”

Get-Process -Name MicrosoftEdge | select *

<#
Name                       : MicrosoftEdge
Id                         : 6388
PriorityClass              : Normal
...
ProductVersion             : 11.00.17763.529
Description                : Microsoft Edge
Product                    : Microsoft Edge
__NounName                 : Process
...
SafeHandle                 : Microsoft.Win32.SafeHandles.SafeProcessHandle
MachineName                : .
MainWindowHandle           : 132100
MainWindowTitle            : Microsoft Edge
MainModule                 : System.Diagnostics.ProcessModule (MicrosoftEdge.exe)
MaxWorkingSet              : 1413120
MinWorkingSet              : 204800
Modules                    : {System....
#>

$Code = @'
$a = 1 
DO { 
    'Starting Loop' 

    $vischk = get-process | 
    where-object {
    $_.mainwindowhandle -ne 0 -and 
    $_.MainWindowTitle -eq 'Microsoft Edge'
    } | select-object name, mainwindowtitle 

    if (!($vischk))
    {Write-Warning 'Microsoft Edge is off'}
    else{
        Write-Warning 'Closing Chrome' 
        Stop-Process -name chrome
    } 

    Write-Warning 'Active surveillance' 
    Start-Sleep -s 3} 
While ($a -le 2)
'@

您可以留在 ISE 中测试代码,但正如 Olaf 指出的,您的用户可能不一样。因此,您需要验证这两种环境。您可以留在 ISE 中并在那里以及在控制台主机中测试您的代码。

因此,要使用来自 ISE/VSCode 的控制台主机实例来测试代码,而无需在控制台中输入。

Start-Process powershell -ArgumentList "-NoExit","-Command  &{ $Code }" -Wait

或者

Start-Process pwsh -ArgumentList "-NoExit","-Command  &{ $Code }" -Wait

或者只是打开控制台主机并运行脚本

以上工作,根据您定义的案例设计。

我也同意 Olaf 的观点,您需要添加更多错误检查来检查正在运行和未运行的内容,以使其在操作上更加合理。如果目标不存在,则不要运行不需要运行的代码。


推荐阅读