1. 从“整蛊”到“脚本思维”:一个技术人的视角
看到“整人代码脚本”这个标题,你可能会心一笑,想起学生时代在机房偷偷运行一个恶作剧程序,看着同学电脑屏幕突然闪烁或鼠标不听使唤时的“恶趣味”。但今天,我想从一个不同的角度来聊这个话题。这些看似简单的VBS、BAT、CMD脚本,其背后蕴含的逻辑和技巧,恰恰是理解Windows系统自动化、批处理编程乃至基础网络交互的绝佳入口。它们不是“玩具”,而是通往更广阔技术世界的“敲门砖”。对于刚入门的朋友,通过亲手编写和剖析这些脚本,你能直观地理解变量、循环、条件判断、系统API调用等核心概念;对于有经验的开发者,重温这些基础,或许能让你在解决某些自动化部署、系统维护或快速原型验证时,找到更轻量、更直接的思路。
所以,本文不会止步于“复制粘贴就能整人”。我将为你拆解五个经典的脚本案例,但重点在于讲清楚每一行代码背后的原理、潜在的应用场景,以及最重要的——如何安全、负责任地使用这些技术。我们会涉及VBScript的窗口控制、BAT/CMD的命令行威力、HTML的视觉欺骗,并探讨如何将它们从“整蛊”改造成真正有用的工具。记住,技术本身无善恶,全在于使用者的意图。我们的目标是学习与创造,而非单纯的破坏或骚扰。
2. 案例一:永不消失的弹窗(VBScript版)
这大概是流传最广的“经典”整蛊脚本之一了。它的效果简单粗暴:不断弹出消息框,关掉一个,立刻又出现一个,直到任务管理器结束wscript.exe进程。
2.1 原始脚本与核心原理
我们先看最基础的版本:
MsgBox "这是一个警告!" x=msgbox("你关不掉我的!", 0+16, "错误") do x=msgbox("哈哈,还是关不掉!", 0+16, "错误") loop这段VBScript代码的核心在于Do...Loop这个无限循环结构。第一行MsgBox是一个简单的提示。第二行开始,它利用msgbox函数的返回值(用户点击了“确定”还是“取消”等)赋值给变量x,但随后立刻进入一个没有退出条件的Do...Loop循环。在循环体内,它持续弹出消息框。由于VBScript是解释执行的,且默认使用wscript.exe引擎运行,这个循环会独占线程,导致界面“卡死”。
注意:在较新的Windows系统(如Win10/11)中,如果用户快速连续地点击“确定”,系统可能会检测到脚本无响应,并弹出一个对话框询问是否终止脚本。但这并不绝对可靠。
2.2 进阶变种与系统交互
一个更“顽固”的变种会结合WScript.Shell对象,尝试干扰用户的关闭操作:
Set wsh = WScript.CreateObject("WScript.Shell") do wsh.Popup "系统关键错误!", 1, "严重警告", 16+4096 ' 4096 参数使窗口保持在最前 loop这里使用了WScript.Shell对象的Popup方法。参数4096(vbSystemModal)使得弹出的窗口成为系统模态对话框,它会保持在所有窗口的最前端,干扰性更强。参数1设置了超时时间(1秒),但实际上因为循环,它还是会不停弹出。
2.3 从“整蛊”到“实用”的改造思路
理解了这个原理,我们可以把它改造成有用的工具。比如,一个简易的休息提醒器:
Set wsh = WScript.CreateObject("WScript.Shell") workDuration = 45 * 60 ' 工作45分钟 breakDuration = 5 * 60 ' 休息5分钟 Do WScript.Sleep(workDuration * 1000) ' 睡眠45分钟,单位是毫秒 result = wsh.Popup("已经连续工作45分钟了,该起来活动一下啦!", 60, "健康提醒", 64+4096) ' 64是信息图标,4096保持在前。60秒后自动关闭。 If result = -1 Then ' 用户没有点击,超时了 wsh.Popup "休息时间到,5分钟后将再次提醒。", 5, "休息结束", 64 Else wsh.Popup "好的,休息一下!5分钟后将再次提醒。", 5, "休息确认", 64 End If WScript.Sleep(breakDuration * 1000) ' 睡眠5分钟 Loop这个脚本就友好多了。它利用WScript.Sleep进行定时,用Popup做非阻塞的提醒(用户可以选择忽略或确认),实现了番茄钟的基本功能。WScript.Shell对象在这里扮演了与用户交互和程序暂停的关键角色。
2.4 安全执行与终止方法
如果你想测试原版脚本,务必知道如何安全地终止它:
- 最有效:按下
Ctrl + Shift + Esc直接打开任务管理器。 - 在“进程”或“详细信息”选项卡中,找到
wscript.exe或cscript.exe进程。 - 右键点击,选择“结束任务”。
为了避免误运行,一个良好的习惯是:永远不要在未知来源的脚本文件上直接双击。你可以用记事本打开先查看内容。对于VBS文件,右键选择“编辑”是安全的查看方式。
3. 案例二:伪装系统命令的“关机”吓唬(BAT/CMD)
这个脚本利用CMD命令的提示符和shutdown命令来制造紧张气氛,但实际可能并不执行真正的关机。
3.1 经典“吓唬”脚本解析
@echo off color 0a echo 警告:检测到系统关键进程冲突。 echo. echo 正在尝试修复... 失败。 echo 初始化强制系统维护程序。 echo. pause shutdown -s -t 60 -c “系统将在60秒后关闭以进行关键更新。若要取消,请在控制台输入:shutdown -a” echo. echo 倒计时开始。输入‘shutdown -a’取消。 ping -n 60 127.0.0.1 > nul shutdown -a echo 维护程序已中断。系统状态不稳定。 echo 建议立即保存所有工作并重新启动。 pause我们来逐行分析这个批处理文件的“演技”:
@echo off:关闭命令本身的回显,让输出更干净。color 0a:将控制台背景设为黑色(0),文字设为亮绿色(a),模仿一些老旧或电影中的“黑客”终端风格,营造氛围。- 随后的几个
echo命令:纯粹是文本输出,用于渲染一种系统正在崩溃、修复、然后强制维护的叙事。 pause:暂停,等待用户按任意键,增加互动感和真实感。shutdown -s -t 60 -c “...”:这是关键命令。-s表示关机,-t 60设置60秒倒计时,-c后面是显示在关机对话框中的消息。运行到这里,系统会真的启动一个60秒后关机的倒计时,并在屏幕中央弹出系统标准的关机提示窗口。ping -n 60 127.0.0.1 > nul:这是一个经典的“睡眠”技巧。ping命令会尝试连接本地地址(127.0.0.1),-n 60表示发送60个数据包,每个包默认间隔约1秒。> nul将ping命令的输出重定向到空设备,从而静默等待大约60秒。这行代码模拟了倒计时过程。shutdown -a:在60秒“等待”结束后,执行-a参数来中止之前的关机命令。所以,最终并不会真的关机。- 最后的
echo和pause:再次渲染“危机并未完全解除”的剧情,让整个体验有头有尾。
3.2shutdown命令的实战应用与排错
这个脚本的核心是shutdown命令。它本身是一个极其强大的系统管理工具,绝非仅用于整蛊。
- 远程关机/重启:
shutdown /m \\计算机名 /s /t 0(需要相应权限) - 计划关机:
at 23:00 shutdown /s(旧版)或结合计划任务使用。 - 强制关闭应用程序:
shutdown /s /f,/f参数强制关闭正在运行的应用程序而不前台警告用户。
一个常见的错误是:在命令行输入shutdown后,系统提示“shutdown‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”。这通常是因为系统的PATH环境变量被修改,或者%SystemRoot%\System32目录(shutdown.exe所在位置)被意外移除。解决方法之一是直接使用完整路径:C:\Windows\System32\shutdown.exe -s -t 60。
3.3 改造为实用的系统维护脚本
我们可以汲取这个脚本的“流程控制”和“命令组合”思想,创建一个下班前自动保存与关机提醒脚本:
@echo off chcp 65001 >nul echo 下班时间快到了!正在执行收尾工作... echo. REM 1. 提醒保存文档(假设使用WPS/Office) echo 请确保所有Office文档已保存。 pause REM 2. 可选:备份特定目录到移动硬盘(示例) set BACKUP_SOURCE=C:\重要工作 set BACKUP_TARGET=D:\Backup\ if exist %BACKUP_TARGET% ( echo 正在备份重要文件到D盘... xcopy %BACKUP_SOURCE% %BACKUP_TARGET% /E /H /C /I /Y echo 备份完成。 ) else ( echo 备份目标D盘未就绪,跳过备份。 ) REM 3. 清理临时文件(谨慎使用) echo 是否清理当前用户的临时文件?(Y/N) set /p choice= if /i "%choice%"=="Y" ( echo 正在清理临时文件... del /q /f %temp%\*.* rmdir /s /q %temp% mkdir %temp% ) REM 4. 计划关机 echo 设置一小时后自动关机,确保所有工作完成。如需取消,请输入 shutdown -a shutdown -s -t 3600 -c “计划关机已启动,一小时后执行。请及时保存未完成的工作。” echo. echo 所有收尾工作已安排完毕。一小时后将自动关机。 pause这个脚本就实用多了。它包含了用户交互(pause,set /p)、条件判断(if)、文件操作(xcopy,del)和计划任务(shutdown)的组合,是一个真正能提升效率的小工具。
4. 案例三:视觉欺骗与页面“锁死”(HTML+JavaScript)
与前两者不同,HTML/JS脚本运行在浏览器环境中,其“整蛊”效果主要体现在视觉干扰和交互阻断上。
4.1 全屏“警告”页面
一个简单的HTML页面就能制造恐慌:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>系统警告</title> <style> body { margin: 0; padding: 0; background-color: black; color: red; font-family: monospace; font-size: 24px; height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: none; } .blink { animation: blink 1s infinite; } @keyframes blink { 50% { opacity: 0; } } </style> </head> <body> <div class="blink">!!! 严重安全警报 !!!</div> <div>检测到非法入侵。</div> <div>系统已锁定。</div> <div>请联系系统管理员。</div> <div>倒计时: <span id="countdown">10</span></div> <script> // 尝试请求全屏(需要用户手势触发,这里仅作示意) // document.documentElement.requestFullscreen().catch(e => console.log(e)); // 禁用右键菜单 document.addEventListener('contextmenu', event => event.preventDefault()); // 倒计时并阻止关闭 let seconds = 10; const countdownEl = document.getElementById('countdown'); const timer = setInterval(() => { seconds--; countdownEl.textContent = seconds; if (seconds <= 0) { clearInterval(timer); // 制造更多视觉干扰,比如疯狂弹窗(会被浏览器拦截) // alert('时间到!'); // 或者跳转到另一个吓人页面 // window.location.href = 'another_scary_page.html'; } }, 1000); // 尝试阻止用户离开(效果有限) window.addEventListener('beforeunload', function (e) { e.preventDefault(); e.returnValue = '确定要离开吗?系统可能处于不安全状态!'; }); </script> </body> </html>这个页面通过CSS营造了类似传统“蓝屏”或黑客电影的视觉效果(黑底红字,闪烁动画)。JavaScript部分尝试做一些干扰:
requestFullscreen:尝试全屏,但现代浏览器要求这个API必须在用户手势(如点击)事件中触发,直接加载时调用会失败。禁用右键菜单:阻止用户通过右键菜单查看源代码或进行其他操作。beforeunload事件:当用户试图关闭标签页或浏览器时,会弹出一个浏览器自带的确认对话框。注意:现代浏览器为了用户体验,对这个事件的处理非常严格,通常只显示浏览器默认的提示文字,自定义信息可能不显示。
4.2 浏览器安全限制与“无害化”
现代浏览器是一个沙盒环境,对JavaScript的能力有严格限制,以防止恶意网站造成真正危害。因此,纯前端的HTML/JS整蛊脚本的威力远不如VBS或BAT这种能直接调用系统资源的脚本。它无法格式化硬盘、无法安装木马、也无法真正阻止用户关闭浏览器(最多是弹个确认框)。它的效果主要依赖于社会工程学——利用人的恐慌心理。
4.3 正向应用:制作浏览器内的紧急通知或演示
我们可以将这种视觉表现力用于正途,比如创建一个公司内部网络状态紧急通知页:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>网络系统维护通知</title> <style> :root { --primary-color: #dc3545; --secondary-color: #ffc107; } body { font-family: 'Segoe UI', system-ui, sans-serif; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .notification-card { background: white; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); max-width: 800px; width: 100%; overflow: hidden; border-left: 8px solid var(--primary-color); } .header { background-color: var(--primary-color); color: white; padding: 24px; display: flex; align-items: center; gap: 16px; } .header h1 { margin: 0; font-size: 1.8rem; } .icon { font-size: 2.5rem; } .content { padding: 32px; } .countdown { font-size: 3rem; font-weight: bold; text-align: center; color: var(--primary-color); margin: 20px 0; font-family: monospace; } .details { line-height: 1.6; color: #495057; } .details ul { padding-left: 20px; } .action-buttons { display: flex; gap: 12px; margin-top: 30px; flex-wrap: wrap; } .btn { padding: 12px 24px; border: none; border-radius: 8px; font-weight: bold; cursor: pointer; transition: all 0.2s; text-decoration: none; display: inline-block; text-align: center; } .btn-primary { background-color: var(--primary-color); color: white; } .btn-secondary { background-color: #6c757d; color: white; } .btn:hover { opacity: 0.9; transform: translateY(-2px); } .progress-container { margin-top: 20px; } .progress-bar { height: 8px; background-color: #e9ecef; border-radius: 4px; overflow: hidden; } .progress-fill { height: 100%; background-color: var(--secondary-color); width: 65%; /* 模拟进度 */ border-radius: 4px; transition: width 0.5s ease; } </style> </head> <body> <div class="notification-card"> <div class="header"> <div class="icon">⚠️</div> <h1>计划外网络中断紧急通知</h1> </div> <div class="content"> <p class="details"> 尊敬的用户,我们检测到核心网络设备出现异常,可能导致部分服务访问中断。技术团队正在紧急处理中。 </p> <div class="countdown" id="countdown">--:--</div> <p class="details"> <strong>影响范围:</strong> <ul> <li>内部文件共享服务 (\\fileserver)</li> <li>客户关系管理系统 (CRM) 外部访问</li> <li>视频会议系统</li> </ul> <strong>预计恢复时间:</strong> 北京时间今日 18:00前。<br> <strong>当前处理进度:</strong> </p> <div class="progress-container"> <div class="progress-bar"> <div class="progress-fill"></div> </div> </div> <div class="action-buttons"> <a href="https://status.company.com" class="btn btn-primary">查看实时状态页</a> <a href="mailto:it-support@company.com" class="btn btn-secondary">联系IT支持</a> <button onclick="window.location.reload()" class="btn">刷新页面获取更新</button> </div> <p class="details" style="margin-top: 20px; font-size: 0.9em; color: #868e96;"> 本页面将每60秒自动刷新。给您带来的不便,我们深表歉意。 </p> </div> </div> <script> // 计算到预计恢复时间的倒计时 function updateCountdown() { const targetTime = new Date(); targetTime.setHours(18, 0, 0, 0); // 设置今天18:00 const now = new Date(); const diff = targetTime - now; if (diff <= 0) { document.getElementById('countdown').textContent = '正在恢复...'; return; } const hours = Math.floor(diff / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); document.getElementById('countdown').textContent = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`; } // 初始化并设置定时器 updateCountdown(); setInterval(updateCountdown, 60000); // 每分钟更新一次 // 模拟进度条缓慢前进(实际应用中应从后端API获取) const progressFill = document.querySelector('.progress-fill'); let progress = 65; const progressInterval = setInterval(() => { if (progress < 100) { progress += Math.random() * 2; // 随机增加进度 progressFill.style.width = Math.min(progress, 100) + '%'; } else { clearInterval(progressInterval); } }, 5000); // 每5秒更新一次进度 </script> </body> </html>这个页面完全使用了相同的技术栈(HTML、CSS、JS),但目的是清晰、专业、及时地传递信息,减少用户的困惑和焦虑。它包含了动态倒计时、进度指示和明确的操作指引,是一个正向的价值输出。
5. 案例四:资源占用与“假死”模拟(BAT/PowerShell)
这类脚本通过快速消耗系统资源(如CPU、内存)或创建大量进程/文件,让电脑变得异常缓慢,模拟出系统崩溃的假象。
5.1 危险的“Fork炸弹”概念
最著名的例子是Unix/Linux下的Fork炸弹(:(){ :|:& };:),在Windows批处理中也有其变体,例如一个创建无限循环并启动自身副本的脚本。我必须强烈警告,这类脚本极其危险,可能瞬间导致系统无响应,只能强制断电重启,可能造成数据丢失。因此,这里不提供具体的可运行代码。其核心逻辑是一个递归或循环调用,不断启动新的cmd.exe进程,直到耗尽系统进程资源。
5.2 无害的“压力测试”模拟器
我们可以编写一个可控的、用于教育目的的CPU占用模拟脚本,它能在指定时间后自动停止:
@echo off echo 这是一个CPU压力测试模拟器(教育用途),将运行30秒。 echo 按 Ctrl+C 可随时强制终止。 echo. set duration=30 echo 开始模拟,持续时间 %duration% 秒... REM 方法:启动一个计算密集型循环的PowerShell进程,并设置超时 powershell -Command "$endTime = (Get-Date).AddSeconds(%duration%); while ((Get-Date) -lt $endTime) { $null = 1..1000000 | ForEach-Object { [math]::Sqrt($_) } }" echo. echo 压力测试模拟结束。 pause这个批处理文件调用了PowerShell。PowerShell命令1..1000000 | ForEach-Object { [math]::Sqrt($_) }会计算一百万个数的平方根,这是一个相对密集的浮点运算,能有效提高CPU占用率。$endTime变量和while循环确保了它在运行指定秒数(这里是30秒)后自动退出。即使如此,在运行前也请保存好所有工作。
5.3 理解系统资源管理与任务管理器
运行这类脚本时,打开任务管理器(Ctrl+Shift+Esc)观察“性能”选项卡和“进程”选项卡是非常好的学习方式。你可以看到:
- CPU使用率:会飙升到接近100%。
- 内存(RAM):简单的计算循环对内存占用不大,但如果是创建大量变量或对象的脚本,内存占用也会上升。
- 磁盘:如果脚本涉及大量文件读写,磁盘活动会变得频繁。
- 进程列表:可以看到
powershell.exe或cmd.exe的进程CPU占用很高。
通过观察这些指标,你能直观理解“系统卡顿”背后的原因。在实际工作中,这种观察能力对于性能调优和故障排查至关重要。例如,一个Java应用内存泄漏,你在任务管理器中就会看到对应的java.exe进程内存持续增长且不释放。
5.4 改造为实用的性能监控辅助脚本
我们可以利用类似的原理,写一个监控指定进程资源占用的简易脚本:
@echo off setlocal enabledelayedexpansion echo 输入要监控的进程名(例如:chrome.exe, code.exe): set /p process_name= echo 监控进程:%process_name% echo 按 Ctrl+C 停止。 echo. :monitor_loop REM 使用wmic命令获取进程的CPU和内存信息 for /f "tokens=2 delims==" %%a in ( 'wmic process where "name='%process_name%'" get WorkingSetSize^,KernelModeTime^,UserModeTime /value 2^>nul' ) do ( set "%%a" ) REM 计算CPU时间(单位:百分之一秒) if defined KernelModeTime if defined UserModeTime ( set /a total_time=!KernelModeTime!+!UserModeTime! ) REM 第一次循环,记录初始时间 if not defined last_total_time ( set last_total_time=%total_time% timeout /t 2 /nobreak >nul goto monitor_loop ) REM 计算间隔内的CPU时间差和占用率(简化版,不精确但可参考) set /a time_diff=total_time - last_total_time REM 假设采样间隔是2秒,总CPU时间片数 = 2秒 * 100(单位换算) * CPU核心数(这里简化按1核算)= 200 set /a cpu_usage_pct=time_diff / 2 REM 转换内存为MB if defined WorkingSetSize ( set /a mem_mb=WorkingSetSize / 1048576 ) cls echo [%time%] 进程监控: %process_name% echo CPU占用(近似): !cpu_usage_pct!%% echo 内存占用: !mem_mb! MB echo ------------------------------ set last_total_time=%total_time% timeout /t 2 /nobreak >nul goto monitor_loop这个脚本使用了wmic(Windows Management Instrumentation Command-line)这个强大的工具来查询进程信息。它每隔2秒采样一次,粗略计算CPU占用百分比和内存占用(MB)。虽然不如专业工具精确,但它展示了如何用批处理自动化地获取系统信息,是一个非常有价值的起点。
6. 案例五:键盘与输入干扰(VBScript)
这个类型的脚本通过控制键盘或鼠标,干扰用户的正常输入,例如自动输入字符、切换大小写、锁定鼠标等。
6.1 使用WScript.Shell发送按键
VBScript的WScript.Shell对象有一个SendKeys方法,可以向活动窗口发送按键序列。
Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 3000 ' 等待3秒,让用户切换到目标窗口 ' 发送一段令人困惑的文字 WshShell.SendKeys "你{ }的{ }键{ }盘{ }好{ }像{ }有{ }点{ }问{ }题{ }。。。" ' { } 代表空格键,这里是为了制造断续效果SendKeys方法可以模拟几乎所有的键盘操作,包括功能键({F1})、组合键(%代表Alt,^代表Ctrl,+代表Shift,如^c是Ctrl+C)。同样,请勿用于恶作剧,这会让用户非常恼火。
6.2 安全风险与防护
这类脚本之所以能工作,是因为VBScript通过Windows脚本宿主获得了较高的权限。从安全角度看,这提示我们:
- 不要随意运行来历不明的
.vbs、.js、.wsf等脚本文件。 - 在公共电脑或不受信任的环境下,可以考虑禁用Windows脚本宿主(通过组策略或修改注册表,但这可能影响系统正常功能,需谨慎)。
- 对于企业环境,可以通过应用白名单策略,限制脚本的执行。
6.3 正向改造:自动化数据输入与测试
SendKeys在自动化测试和简化重复操作方面大有可为。例如,一个自动填写固定格式日报的脚本(假设日报在某个网页表单中):
Set WshShell = WScript.CreateObject("WScript.Shell") ' 假设我们已经用浏览器打开了日报页面,并焦点在第一个输入框 MsgBox "请确保浏览器窗口是活动窗口,且光标在‘今日工作’输入框内。5秒后开始自动填写。", 64, "提示" WScript.Sleep 5000 ' 模拟填写“今日工作” WshShell.SendKeys "1. 完成了项目A的模块X的代码开发与单元测试。{ENTER}" WshShell.SendKeys "2. 参加了团队关于架构设计的评审会议,并提出两点优化建议。{ENTER}" WshShell.SendKeys "3. 协助同事B排查了生产环境的一个数据同步问题。" WScript.Sleep 500 ' 等待一下,让浏览器反应 ' 模拟按Tab键切换到下一个输入框(“遇到的问题”) WshShell.SendKeys "{TAB}" WScript.Sleep 300 WshShell.SendKeys "无重大问题。" WScript.Sleep 300 ' 再按Tab切换到“明日计划” WshShell.SendKeys "{TAB}" WScript.Sleep 300 WshShell.SendKeys "1. 继续推进模块Y的开发。{ENTER}" WshShell.SendKeys "2. 准备项目周报材料。" MsgBox "日报内容已自动填充完毕,请检查并提交。", 64, "完成"这个脚本极大地简化了每天都要进行的重复性表单填写工作。当然,它非常脆弱,依赖于窗口焦点和页面结构不变。在实际自动化中,更推荐使用专门的自动化工具如AutoHotkey、Python的pyautogui或selenium库,它们提供更稳定、更强大的控制能力。
6.4 使用AutoHotkey实现更健壮的自动化
虽然超出了纯脚本范畴,但作为延伸,AutoHotkey(AHK)是Windows下自动化任务的终极利器之一。它语法类似脚本,但功能强大得多。上面日报填写的例子,用AHK可以写得更稳健:
#NoEnv SendMode Input SetWorkingDir %A_ScriptDir% ; 定义一个热键:按下 Ctrl+Alt+D 开始自动填写 ^!d:: ; 这里可以加入激活特定浏览器窗口的代码,例如: ; IfWinNotExist, 日报系统 - Chrome ; { ; MsgBox, 请先打开日报页面。 ; return ; } ; WinActivate ; WinWaitActive MsgBox, 4, , 请确保光标在‘今日工作’输入框,是否继续? IfMsgBox No return Sleep, 1000 ; 等待1秒 ; 发送文本,`{Enter}`代表回车 Send, 1. 完成了项目A的模块X的代码开发与单元测试。{Enter} Send, 2. 参加了团队关于架构设计的评审会议,并提出两点优化建议。{Enter} Send, 3. 协助同事B排查了生产环境的一个数据同步问题。 Sleep, 500 Send, {Tab} Sleep, 300 Send, 无重大问题。 Sleep, 300 Send, {Tab} Sleep, 300 Send, 1. 继续推进模块Y的开发。{Enter} Send, 2. 准备项目周报材料。 MsgBox, 自动填充完成。 returnAHK脚本可以编译成独立的.exe文件,并且通过窗口标题、类名等更精确地定位目标,比单纯的SendKeys可靠得多。