cdl*_*dlv 2 windows cmd batch-file popup-balloons
我想显示长时间运行的批次的气球通知.
我知道你可以显示弹出窗口(有些解决方案非常富有想象力),但是这个选项也很有意思.
有没有办法可以从批处理文件中显示气球通知?从Windows 7开始至少请,但XP也欢迎.
我想至少需要一个托盘图标,但坦率地说,我不能走得更远.也许有rundll32.exe
?我知道这不是从命令行做任何事情的推荐方法.
此知识库文章中介绍了rundll32.exe调用的函数所需的函数签名. 这并没有阻止人们使用rundll32来调用那些不是由rundll32调用的随机函数,比如user32 LockWorkStation 或者user32 ExitWindowsEx.
但我发现这个RunAnyDll工具通过的Yaniv Pessach出现使.dll文件调用正确的.不幸的是,我发现没有一个工作链接来测试它(不,它不在Internet存档中).我写过作者问他一个.让我们来看看.
(我甚至不知道它是否有用,但它是一个有趣的实用程序.也许它可以解决弹出问题.我认为Run
框和命令行执行之间的区别与调用约定有关雷蒙德陈的帖子.)
另一个不可测试的实用工具是被弃用的触发器,但我不确定它是否会有所帮助.
无论npocmaka和格雷格·扎哈罗夫答案是非常有趣的.npocmaka的一个更接近我的要求,因为它会产生一个气球通知.greg zakharov使用不同的技术,但其结果非常相似(在这种情况下是鼠标指针位置出现的文本).我已经在XP中对它们进行了测试并且都可以工作(安装了.NET).两者都有超时,我不知道如何在用户点击之前保留通知(以防万一用户不在,但你想看到它).
理想情况下,我的问题是关于得到这样的东西.
@echo off
echo Some long part job that goes well.
call :balloon "Report about above tasks" [optional parameters about icon, title, timeout, etc.]
echo More tasks but one fails
if errorlevel 1 call :balloon "Error this and that" [optional parameters]
echo This is the end of the tasks
goto :eof
:balloon
echo If you don't want to make a temporary file
echo then you must make one-liner calls to PowerShell, wscript or whatever.
exit /b
Run Code Online (Sandbox Code Playgroud)
因此,作为混合脚本,我看到的缺点是必须非常难以在任何批次中插入它..exe
如果要在批处理中重复使用多次,那么为每个气球生成一个似乎是不切实际的,因此,最终,正如greg zakharov所说,生成一个接受参数并重复使用它的.exe更加健壮和灵活(就像notifu一样)).最后,我想使用一个:balloon
进行单线程PowerShell调用的子程序是你能得到的最好的(几乎原生在XP中,因为你需要下载,但你也需要.net).
无需创建文件,无论执行策略如何,它都可以工作。由于马克Dodsons这表明我们的方式与PS,并为此npocmaka的图标列表。
例如,另存为balloon.bat
(当然,您可以将其作为子程序插入到任何批处理中)。
@echo off
if "%~1"=="" call :printhelp & exit /b 1
setlocal
if "%~2"=="" (set Icon=Information) else (set Icon=%2)
powershell -Command "[void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); $objNotifyIcon=New-Object System.Windows.Forms.NotifyIcon; $objNotifyIcon.BalloonTipText='%~1'; $objNotifyIcon.Icon=[system.drawing.systemicons]::%Icon%; $objNotifyIcon.BalloonTipTitle='%~3'; $objNotifyIcon.BalloonTipIcon='None'; $objNotifyIcon.Visible=$True; $objNotifyIcon.ShowBalloonTip(5000);"
endlocal
goto :eof
:printhelp
echo USAGE: %~n0 Text [Icon [Title]]
echo Icon can be: Application, Asterisk, Error, Exclamation, Hand, Information, Question, Shield, Warning or WinLogo
exit /b
Run Code Online (Sandbox Code Playgroud)
如果没有第二个参数,则默认为Information
.
我想你可以使用mshta
和 vbscript 或 javascript,但直到现在我都没有成功。
这是一个jscript.net/bat多语言脚本(必须保存为.bat
),其中包含硬编码值(代码与我的注释中的链接几乎相同),这将创建一个简单的系统托盘通知(适用于安装了.NET的每个系统)自Windows Vista以来,默认情况下在每台Windows机器上安装.NET,因此这比PowerShell更向后兼容):
@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
del /q /f %~n0.exe >nul 2>&1
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
set "jsc=%%v"
)
if not exist "%~n0.exe" (
"%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)
if exist "%~n0.exe" (
"%~n0.exe" %*
)
endlocal & exit /b %errorlevel%
end of jscript comment*/
import System;
import System.Windows;
import System.Windows.Forms;
import System.Drawing;
import System.Drawing.SystemIcons;
var notification;
try {
notification = new System.Windows.Forms.NotifyIcon();
} catch (err){
}
notification.Icon = System.Drawing.SystemIcons.Hand; // Could be Application,Asterisk,Error,Exclamation,Hand,Information,Question,Shield,Warning,WinLogo
notification.BalloonTipText = "Message!!";
notification.Visible = true;
// optional - BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
// optional - BalloonTipTitle = "My Title",
// Display for 2 seconds.
notification.ShowBalloonTip(2000);
System.Threading.Thread.Sleep(2100);
notification.Dispose();
Run Code Online (Sandbox Code Playgroud)
它将编译一个将被调用的小型可执行文件.如果您不想创建临时可执行文件,可以检查此处使用的msbuild技术(尽管这仅适用于Windows 10).我也可以创建一个参数化版本.
call systemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Run Code Online (Sandbox Code Playgroud)