我想让当用户运行特定程序(例如 Firefox)时,我的批处理文件在后台启动。
我使用了下面的代码,但它使我的批处理文件启动代替Firefox。我不想要那个。我希望批处理文件监听计算机中的程序,当某个程序启动时,批处理文件将在后台启动。
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\firefox.exe" /v Debugger /d "D:\Desktop\m.bat" /f
我怎样才能做到这一点?
答案1
您可以使用以下 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
}
}
它使用 WMI 来监视新进程的创建,如果该进程属于firefox.exe
,它会启动一个隐藏的命令提示符(除非从上次启动 Firefox 时已经在运行该命令提示符)。
如果您希望每次启动 Firefox 时都运行新的批处理文件,请使用这个更简单的脚本:
$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
}
}
如果不想让提示窗口完全隐藏,只需改为-WindowStyle Hidden
即可-WindowStyle Minimized
。
将您选择的 PowerShell 脚本保存为.ps1
文件。要在登录时启动它,请将包含以下内容的批处理文件放在启动文件夹中:
powershell -file 'C:\path\to\powershellScript.ps1' -executionpolicy bypass -windowstyle Hidden