Cómo ejecutar un archivo por lotes en segundo plano cuando se inicia un programa específico

0

Quiero hacerlo de modo que cuando un usuario ejecute un programa específico, como Firefox, mi archivo por lotes comience en segundo plano.

Usé el código a continuación, pero hace que mi archivo por lotes se inicie en lugar de Firefox. No quiero eso Quiero que el archivo por lotes escuche los programas en la computadora y cuando se inicia un determinado programa, el archivo por lotes se iniciará en segundo plano.

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\firefox.exe" /v Debugger /d "D:\Desktop\m.bat" /f

¿Cómo puedo lograr esto?

Muhammad Khaled
fuente
¿ Realmente desea que su archivo por lotes se ejecute siempre que se inicie algún programa (como se indica en el título de su pregunta)? ¿O desea que su archivo por lotes se ejecute cuando solo se ejecutan programas específicos?
Imitador de Twisty
cuando solo un programa específico como firefox
Muhammad Khaled
@Twisty cuando solo un programa específico como firefox
Muhammad Khaled

Respuestas:

0

Puede usar este script de PowerShell:

$query = New-Object System.Management.WqlEventQuery ("__InstanceCreationEvent", (New-Object TimeSpan (0, 0, 1)), 'TargetInstance isa "Win32_Process"')
$watcher = New-Object System.Management.ManagementEventWatcher
$watcher.Query = $query
$watcher.Options.Timeout = [System.Management.ManagementOptions]::InfiniteTimeout
$curProc = $null
While ($true) {
    $e = $watcher.WaitForNextEvent().TargetInstance
    If ($e.Name -eq 'firefox.exe' -and ($curProc -eq $null -or $curProc.ExitTime -ne $null)) {
        $curProc = Start-Process 'cmd' -Argument '/c C:\path\to\script.bat' -PassThru -WindowStyle Hidden
    }
}

Utiliza WMI para observar la creación de nuevos procesos, y si el proceso pertenece firefox.exe, inicia un símbolo del sistema oculto (a menos que ya se esté ejecutando desde un inicio anterior de Firefox).

Si desea que se inicie una nueva ejecución del archivo por lotes cada vez que se inicia Firefox, use este script más simple:

$query = New-Object System.Management.WqlEventQuery ("__InstanceCreationEvent", (New-Object TimeSpan (0, 0, 1)), 'TargetInstance isa "Win32_Process"')
$watcher = New-Object System.Management.ManagementEventWatcher
$watcher.Query = $query
$watcher.Options.Timeout = [System.Management.ManagementOptions]::InfiniteTimeout
While ($true) {
    $e = $watcher.WaitForNextEvent().TargetInstance
    If ($e.Name -eq 'firefox.exe' ) {
        Start-Process 'cmd' -Argument '/c C:\path\to\script.bat' -WindowStyle Hidden
    }
}

Si no desea que la ventana de solicitud esté completamente oculta, simplemente cambie -WindowStyle Hiddena -WindowStyle Minimized.

Guarde el script de PowerShell seleccionado como un .ps1archivo. Para iniciarlo en su inicio de sesión, coloque un archivo por lotes que lo contenga en su carpeta de inicio:

powershell -file 'C:\path\to\powershellScript.ps1' -executionpolicy bypass -windowstyle Hidden
Ben N
fuente
muchas gracias pero el código no funciona Copié su código y cambié los parámetros pero no se había producido nada
Muhammad Khaled
Tengo este error No puede llamar a un método en una expresión de valor nulo. En D: \ power.ps1: 6 Char: 35 + $ e = $ watcher.WaitForNextEvent <<<< () .TargetInstance + CategoryInfo: InvalidOperation: (WaitForNextEvent: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull
Muhammad Khaled
@MuhammadKhaled Interesante, me funciona en Windows 10 x64. ¿Qué versión de Windows tienes? Es posible que la ::newsintaxis especial no sea compatible con la versión de PowerShell que viene con su versión.
Ben N
@MuhammadKhaled He actualizado mis scripts para usar el New-Objectenfoque anterior . ¿Funciona ahora?
Ben N