如何创建一个可延迟的倒计时消息框,它会触发 bat 文件
How do I create a Delayable count down msg box, which triggers bat file
您好,我正在尝试创建一个带有 "DELAY" 按钮的消息框如果用户没有按下延迟按钮,脚本将启动一个批处理文件(或命令)
所以它应该是这样的:
您好,用户您的管理员要求您在下班后退出此应用程序,我们检测到您仍在使用该程序,如果您还在您的机器旁,请按延迟。
理想情况下,我希望它检测某个程序何时处于活动状态,并且仅在它处于活动状态时才激活
谢谢
这是最终版本
@if (@CodeSection == @Batch) @then
@echo off
setlocal
for /f %%I in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x07"') do set "beep=%%I"
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
setlocal
set "task=agent.exe"
set "timeout=120"
rem // Is %task% running?
tasklist /fi "imagename eq %task%" | find /i "%task%" >NUL && (
rem // Re-launch script with JScript interpreter
wscript /e:JScript /nologo "%~f0" %timeout% || (
rem // If timeout or user hits No, kill %task%
taskkill /im "%task%" /f
)
)
rem // End main runtime
goto :EOF
rem // Begin JScript portion
@end
var osh = WSH.CreateObject('WScript.Shell'),
nag = 'Greetings! Your administrator has requested you to log out of Touchstar '
+ 'after work. It appears you are still using it.'
+ ' If you are still here, Press Yes to continue working.\n\n'
+ 'Otherwise, press no to close touchstar.'
+ 'Touchstar will close automatically in less than ' + WSH.Arguments(0) + ' seconds.';
popup = osh.Popup(nag, WSH.Arguments(0), 'Are you still here?', 0x4 + 0x20 + 0x1000);
WSH.Quit(popup - 6);
感谢所有帮助创建此内容的人(对 Rojo 的大力支持)和所有回答的人。
- 密度计
挑战:接受。将其另存为 .bat 文件并运行它。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "task=cmd.exe"
set "timeout=60"
rem // Is %task% running?
tasklist /fi "imagename eq %task%" | find /i "%task%" >NUL && (
rem // Re-launch script with JScript interpreter
wscript /e:JScript /nologo "%~f0" %timeout% || (
rem // If timeout or user hits No, kill %task%
taskkill /im "%task%" /f
)
)
rem // End main runtime
goto :EOF
rem // Begin JScript portion
@end
var osh = WSH.CreateObject('WScript.Shell'),
noise = WSH.CreateObject('WMPlayer.OCX.7'),
nag = 'Greetings! Your administrator has requested you to log out of this '
+ 'application after work. It appears you are still using the program. If '
+ 'you are, in fact, not at your computer, please ignore this message.\n\n'
+ 'Otherwise, press Yes to continue working, or No to go ahead and close the '
+ 'application. This message will self-destruct in ' + WSH.Arguments(0)
+ ' seconds.';
with (noise) {
URL = osh.Environment('Process')('SYSTEMROOT') + '\Media\Windows Exclamation.wav';
Controls.play();
}
popup = osh.Popup(nag, WSH.Arguments(0), 'Are you still here?', 0x4 + 0x20 + 0x1000);
WSH.Quit(popup - 6);
该脚本采用了 JosefZ 建议的 WshShell.Popup()
方法,非常简单明了。它使用 hybrid convention for including JScript within a batch script without having to use secondary / temporary files. It also employs conditional execution 来评估 find
和 wscript
.
的退出代码
WMPlayer.OCX.7
播放声音的想法来自 this answer。
编辑: 我看到了你上面的编辑以及你努力将 ^G
包含在你的粘贴中。看一下这个。您可以像这样捕获一个变量的蜂鸣声:
@echo off
setlocal
for /f %%I in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x07"') do set "beep=%%I"
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
... 将发出 3 声蜂鸣声而不回显新行。
将其另存为 .bat 文件:
@if (@CodeSection == @Batch) @then
@echo off
CScript //nologo //E:JScript "%~F0"
if %errorlevel% equ -1 (
echo The user NOT confirmed, proceed to auto-destruction!
) else (
echo Continue normally...
)
pause
goto :EOF
@end
WScript.Quit(WScript.CreateObject("WScript.Shell").Popup(
"This program will proceed to auto-destruction\nunless you press OK in 10 seconds",
10,"Popup Title",48))
10 是秒数,48 是显示的图标类型(在本例中为感叹号),但您可以按照说明进行修改 here。
这是另一种纯 vbscript 解决方案,可让您监控多个应用程序。只要试一试,你就会明白我的意思。
Option Explicit
If AppPrevInstance() Then
MsgBox "There is an existing proceeding !" & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,"There is an existing proceeding !"
WScript.Quit
Else
Do
Call Main(Array("c:\toto1.bat","c:\toto2.bat","c:\toto3.bat","%ProgramFiles%\Internet Explorer\iexplore.exe"))
Call Pause(1) 'Sleeping for 1 minute
Loop
End If
'**************************************************************************
Sub Main(colProcessPaths)
Dim ProcessPath
For Each ProcessPath In colProcessPaths
CheckProcess(ProcessPath)
Next
End Sub
'**************************************************************************
Sub CheckProcess(ProcessPath)
On error resume Next
Dim Process,objWMIService,colProcesses,wshShell,btn,Timeout,User
Dim ProcessName : ProcessName = StripProcPath(ProcessPath)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Commandline LIKE " & CommandLineLike(ProcessName))
For Each Process in colProcesses
If colProcesses.Count > 0 Then
Set wshShell = CreateObject("WScript.Shell")
User = CreateObject("WScript.Network").UserName
Timeout = 30 'Call the Popup method with a 30 seconds timeout.
btn = WshShell.Popup("Hello "& DblQuote(User) & " !" & vbcr &_
"Your Administrator has requested you to log out of this application after work. " & vbcr &_
"We have detected you are still using the program : "& DblQuote(ProcessName) & vbcr &_
"Please press on cancel button if you are still at your machine ?",Timeout,"Question", vbOKCancel + vbQuestion)
Select Case btn
' Yes button pressed.
case 1
Process.Terminate(0)
' No button pressed.
case 2
Exit Sub
' Timed out.
case -1
Process.Terminate(0)
End Select
Else
Exit Sub
End if
Next
End Sub
'**************************************************************************
Function AppPrevInstance()
With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\.\root\cimv2")
With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
" AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")
AppPrevInstance = (.Count > 1)
End With
End With
End Function
'**************************************************************************
Sub Pause(Minutes)
Wscript.Sleep(Minutes*1000*60)
End Sub
'**************************************************************************
Function StripProcPath(ProcessPath)
Dim arrStr : arrStr = Split(ProcessPath, "\")
StripProcPath = arrStr(UBound(arrStr))
End Function
'**************************************************************************
Function CommandLineLike(ProcessPath)
ProcessPath = Replace(ProcessPath, "\", "\")
CommandLineLike = "'%" & ProcessPath & "%'"
End Function
'**************************************************************************
Function DblQuote(Str)
DblQuote = Chr(34) & Str & Chr(34)
End Function
'**************************************************************************
您好,我正在尝试创建一个带有 "DELAY" 按钮的消息框如果用户没有按下延迟按钮,脚本将启动一个批处理文件(或命令)
所以它应该是这样的:
您好,用户您的管理员要求您在下班后退出此应用程序,我们检测到您仍在使用该程序,如果您还在您的机器旁,请按延迟。
理想情况下,我希望它检测某个程序何时处于活动状态,并且仅在它处于活动状态时才激活
谢谢
这是最终版本
@if (@CodeSection == @Batch) @then
@echo off
setlocal
for /f %%I in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x07"') do set "beep=%%I"
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
setlocal
set "task=agent.exe"
set "timeout=120"
rem // Is %task% running?
tasklist /fi "imagename eq %task%" | find /i "%task%" >NUL && (
rem // Re-launch script with JScript interpreter
wscript /e:JScript /nologo "%~f0" %timeout% || (
rem // If timeout or user hits No, kill %task%
taskkill /im "%task%" /f
)
)
rem // End main runtime
goto :EOF
rem // Begin JScript portion
@end
var osh = WSH.CreateObject('WScript.Shell'),
nag = 'Greetings! Your administrator has requested you to log out of Touchstar '
+ 'after work. It appears you are still using it.'
+ ' If you are still here, Press Yes to continue working.\n\n'
+ 'Otherwise, press no to close touchstar.'
+ 'Touchstar will close automatically in less than ' + WSH.Arguments(0) + ' seconds.';
popup = osh.Popup(nag, WSH.Arguments(0), 'Are you still here?', 0x4 + 0x20 + 0x1000);
WSH.Quit(popup - 6);
感谢所有帮助创建此内容的人(对 Rojo 的大力支持)和所有回答的人。
- 密度计
挑战:接受。将其另存为 .bat 文件并运行它。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "task=cmd.exe"
set "timeout=60"
rem // Is %task% running?
tasklist /fi "imagename eq %task%" | find /i "%task%" >NUL && (
rem // Re-launch script with JScript interpreter
wscript /e:JScript /nologo "%~f0" %timeout% || (
rem // If timeout or user hits No, kill %task%
taskkill /im "%task%" /f
)
)
rem // End main runtime
goto :EOF
rem // Begin JScript portion
@end
var osh = WSH.CreateObject('WScript.Shell'),
noise = WSH.CreateObject('WMPlayer.OCX.7'),
nag = 'Greetings! Your administrator has requested you to log out of this '
+ 'application after work. It appears you are still using the program. If '
+ 'you are, in fact, not at your computer, please ignore this message.\n\n'
+ 'Otherwise, press Yes to continue working, or No to go ahead and close the '
+ 'application. This message will self-destruct in ' + WSH.Arguments(0)
+ ' seconds.';
with (noise) {
URL = osh.Environment('Process')('SYSTEMROOT') + '\Media\Windows Exclamation.wav';
Controls.play();
}
popup = osh.Popup(nag, WSH.Arguments(0), 'Are you still here?', 0x4 + 0x20 + 0x1000);
WSH.Quit(popup - 6);
该脚本采用了 JosefZ 建议的 WshShell.Popup()
方法,非常简单明了。它使用 hybrid convention for including JScript within a batch script without having to use secondary / temporary files. It also employs conditional execution 来评估 find
和 wscript
.
WMPlayer.OCX.7
播放声音的想法来自 this answer。
编辑: 我看到了你上面的编辑以及你努力将 ^G
包含在你的粘贴中。看一下这个。您可以像这样捕获一个变量的蜂鸣声:
@echo off
setlocal
for /f %%I in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x07"') do set "beep=%%I"
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
set /P "=%beep%"<NUL
... 将发出 3 声蜂鸣声而不回显新行。
将其另存为 .bat 文件:
@if (@CodeSection == @Batch) @then
@echo off
CScript //nologo //E:JScript "%~F0"
if %errorlevel% equ -1 (
echo The user NOT confirmed, proceed to auto-destruction!
) else (
echo Continue normally...
)
pause
goto :EOF
@end
WScript.Quit(WScript.CreateObject("WScript.Shell").Popup(
"This program will proceed to auto-destruction\nunless you press OK in 10 seconds",
10,"Popup Title",48))
10 是秒数,48 是显示的图标类型(在本例中为感叹号),但您可以按照说明进行修改 here。
这是另一种纯 vbscript 解决方案,可让您监控多个应用程序。只要试一试,你就会明白我的意思。
Option Explicit
If AppPrevInstance() Then
MsgBox "There is an existing proceeding !" & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,"There is an existing proceeding !"
WScript.Quit
Else
Do
Call Main(Array("c:\toto1.bat","c:\toto2.bat","c:\toto3.bat","%ProgramFiles%\Internet Explorer\iexplore.exe"))
Call Pause(1) 'Sleeping for 1 minute
Loop
End If
'**************************************************************************
Sub Main(colProcessPaths)
Dim ProcessPath
For Each ProcessPath In colProcessPaths
CheckProcess(ProcessPath)
Next
End Sub
'**************************************************************************
Sub CheckProcess(ProcessPath)
On error resume Next
Dim Process,objWMIService,colProcesses,wshShell,btn,Timeout,User
Dim ProcessName : ProcessName = StripProcPath(ProcessPath)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Commandline LIKE " & CommandLineLike(ProcessName))
For Each Process in colProcesses
If colProcesses.Count > 0 Then
Set wshShell = CreateObject("WScript.Shell")
User = CreateObject("WScript.Network").UserName
Timeout = 30 'Call the Popup method with a 30 seconds timeout.
btn = WshShell.Popup("Hello "& DblQuote(User) & " !" & vbcr &_
"Your Administrator has requested you to log out of this application after work. " & vbcr &_
"We have detected you are still using the program : "& DblQuote(ProcessName) & vbcr &_
"Please press on cancel button if you are still at your machine ?",Timeout,"Question", vbOKCancel + vbQuestion)
Select Case btn
' Yes button pressed.
case 1
Process.Terminate(0)
' No button pressed.
case 2
Exit Sub
' Timed out.
case -1
Process.Terminate(0)
End Select
Else
Exit Sub
End if
Next
End Sub
'**************************************************************************
Function AppPrevInstance()
With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\.\root\cimv2")
With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
" AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")
AppPrevInstance = (.Count > 1)
End With
End With
End Function
'**************************************************************************
Sub Pause(Minutes)
Wscript.Sleep(Minutes*1000*60)
End Sub
'**************************************************************************
Function StripProcPath(ProcessPath)
Dim arrStr : arrStr = Split(ProcessPath, "\")
StripProcPath = arrStr(UBound(arrStr))
End Function
'**************************************************************************
Function CommandLineLike(ProcessPath)
ProcessPath = Replace(ProcessPath, "\", "\")
CommandLineLike = "'%" & ProcessPath & "%'"
End Function
'**************************************************************************
Function DblQuote(Str)
DblQuote = Chr(34) & Str & Chr(34)
End Function
'**************************************************************************