8月份的To-Do List

本文计划完成《Effective Objective-C 2.0》的学习总结,复习C语言为算法学习打下坚实的基础,同时通过阅读《自控力》提高个人自制能力。

1.汲取归纳《Effective Objective-C 2.0 》的知识点
2.回顾网易云课堂翁恺老师的C语言相关课程, 为学习算法做好准备
3.读完Kelly McGonigal的《自控力》
4.抽空看完灌篮高手漫画全国大赛篇

转载于:https://www.cnblogs.com/ShaRuru/p/5711187.html

@echo off setlocal enabledelayedexpansion chcp 65001 >nul title ApacheBlockPerMin :: ------------------------------------------------------------ :: 运行日志(与脚本同目录 debug.log) set "debugLog=%~dp0debug.log" :: ========== 配置 ========== set "logDir=C:\xampp\apache\logs" set "threshold=10" set "scanInterval=60" set "blockList=C:\Users\Administrator\Desktop\blocked_ips.txt" :: ========================== :loop echo [%date% %time%] ===== loop ===== echo [%date% %time%] ===== loop ===== >> "%debugLog%" :: ---------- 检查管理员 ---------- net session >nul 2>&1 || ( echo [ERR] 需要以管理员身运行 echo [%date% %time%] [ERR] 需要以管理员身运行 >> "%debugLog%" pause exit /b 1 ) :: ---------- 确定日志文件 ---------- set "logFile=%logDir%\access.log" if exist "%logDir%\access_log.%date:~0,4%-%date:~5,2%-%date:~8,2%.log" ( set "logFile=%logDir%\access_log.%date:~0,4%-%date:~5,2%-%date:~8,2%.log" ) echo [%date% %time%] [INFO] 使用日志文件: %logFile% echo [%date% %time%] [INFO] 使用日志文件: %logFile% >> "%debugLog%" :: ---------- 生成上一分钟键(中文月,适用于 CLF 格式) ---------- for /f %%t in ('powershell -NoLogo -NoProfile -Command ^ "$culture = New-Object System.Globalization.CultureInfo('zh-CN'); ^ (Get-Date).AddMinutes(-1).ToString(''dd/MMM/yyyy:HH:mm'', $culture)"') do ( set "minStr=%%t" ) echo [%date% %time%] [INFO] 扫描上一分钟 minStr=!minStr! echo [%date% %time%] [INFO] 扫描上一分钟 minStr=!minStr! >> "%debugLog%" :: ---------- 清空计数器 ---------- for /f "delims==" %%i in ('set found 2^>nul') do set "%%i=" :: ---------- 扫描日志 ---------- echo [%date% %time%] [DEBUG] 开始扫描日志文件: %logFile% echo [%date% %time%] [DEBUG] 开始扫描日志文件: %logFile% >> "%debugLog%" :: 用 findstr 先筛出可能的行,再用 for /f 逐行读取 findstr /r /c:"^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* .*\[[0-9][0-9]/[A-Za-z][a-z][a-z]/[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9] \+[0-9][0-9][0-9][0-9]\]" "%logFile%" 2>nul | for /f "tokens=1,4 delims=[]:" %%a in ('more') do ( set "ip=%%a" set "ts=%%b" set "ts=!ts:~0,11!" if /i "!ts!"=="!minStr!" ( echo [DEBUG] 匹配成功 IP=!ip! 时间=!ts! echo [%date% %time%] [DEBUG] 匹配成功 IP=!ip! 时间=!ts! >> "%debugLog%" set /a found[!ip!]+=1 ) ) echo [%date% %time%] [DEBUG] 日志扫描完成 echo [%date% %time%] [DEBUG] 日志扫描完成 >> "%debugLog%" :: 输出匹配结果用于调试 for /f "tokens=1,2 delims==" %%i in ('set found 2^>nul') do ( echo [DEBUG] IP=%%i 计数=%%j echo [%date% %time%] [DEBUG] IP=%%i 计数=%%j >> "%debugLog%" ) :: ---------- 封禁 ---------- for /f "tokens=1,2 delims==" %%i in ('set found 2^>nul') do ( set "ip=%%i" set "cnt=%%j" if !cnt! geq %threshold% ( echo [%date% %time%] [ACTION] 封禁 !ip! !cnt!/min echo [%date% %time%] [ACTION] 封禁 !ip! !cnt!/min >> "%debugLog%" netsh advfirewall firewall show rule name="Block_!ip!" | findstr /i "规则名称" >nul if errorlevel 1 ( netsh advfirewall firewall add rule name="Block_!ip!" dir=in action=block remoteip=!ip! >nul if !errorlevel! neq 0 ( echo [%date% %time%] [ERR] 添加防火墙规则失败 echo [%date% %time%] [ERR] 添加防火墙规则失败 >> "%debugLog%" ) else ( echo !ip! >> "%blockList%" schtasks /create /sc once /st 23:59 /tn "Unblock_!ip!" ^ /tr "netsh advfirewall firewall delete rule name='Block_!ip!'" /f >nul if !errorlevel! neq 0 ( echo [%date% %time%] [ERR] 创建任务计划失败 echo [%date% %time%] [ERR] 创建任务计划失败 >> "%debugLog%" ) ) ) ) ) echo [%date% %time%] [DEBUG] 封禁操作完成 echo [%date% %time%] [DEBUG] 封禁操作完成 >> "%debugLog%" timeout /t %scanInterval% /nobreak >nul goto :loop 还是闪退
07-14
<think>我们正在处理一个关于Windows批处理脚本(ApacheBlockPerMin.bat)运行闪退的问题。用户需要调试这个脚本。 由于批处理脚本运行时会打开一个命令提示符窗口,而闪退通常意味着脚本执行过程中遇到了错误导致立即退出。 调试方法通常包括:让脚本暂停以便查看错误信息、逐步执行、记录日志等。 常见调试步骤: 1. 在脚本开头添加`pause`命令,这样脚本在运行前会暂停,等待用户按键。如果是因为环境问题(如路径不对)导致立即退出,这样可以看到错误信息。 2. 在关键命令后添加`pause`,逐步排查。 3. 使用`echo`输出信息,以便跟踪执行流程。 4. 重定向输出到日志文件,以便查看错误信息。 5. 检查脚本中的语法错误,比如括号不匹配、变量引用错误等。 6. 确保脚本中使用的命令和程序路径正确。 针对用户提到的特定脚本“ApacheBlockPerMin.bat”,由于没有提供具体内容,我们只能给出一般性建议。 具体步骤建议: 步骤1:在脚本开头添加`@echo on`(如果还没有的话)以便显示每条命令,然后添加`pause`: ```batch @echo on pause :: 下面是原有脚本内容 ``` 步骤2:如果脚本很长,可以在不同段落添加多个`pause`,观察执行到哪里退出。 步骤3:如果脚本执行到某条命令后闪退,则问题可能出在该命令。检查该命令的语法和参数。 步骤4:将输出重定向到文件: ```batch @echo on call ApacheBlockPerMin.bat > log.txt 2>&1 ``` 但是注意,如果脚本本身已经闪退,我们可能需要在脚本内部重定向。所以可以在脚本内部使用: ```batch @echo off setlocal REM 重定向整个脚本的输出 call :main >> "debug.log" 2>&1 exit /b :main REM 这里是脚本的主要逻辑 ... ``` 或者,更简单的方法:在运行脚本时重定向。在命令行中执行: ApacheBlockPerMin.bat > log.txt 2>&1 步骤5:检查环境变量,特别是脚本中使用的路径是否存在。 步骤6:如果脚本使用了外部程序(如Apache的日志文件、grep等),确保这些程序可用且路径正确。 由于用户没有提供脚本内容,我们只能给出通用方法。 此外,如果脚本是用于分析Apache日志(从文件名推测),那么可能涉及到日志文件路径,需要检查该路径是否正确。 下面是一个示例的调试修改: 原始脚本(假设): @echo off set LOGFILE=C:\Apache24\logs\access.log for /f "tokens=1,2,3,4,5,6,7,8,9,10 delims= " %%a in ('type %LOGFILE% ^| find "GET /block"') do ( echo %%a %%b %%c ) 调试修改(在开头加入暂停并打开回显): @echo on pause set LOGFILE=C:\Apache24\logs\access.log pause for /f "tokens=1,2,3,4,5,6,7,8,9,10 delims= " %%a in ('type %LOGFILE% ^| find "GET /block"') do ( echo %%a %%b %%c ) pause 这样,运行脚本时,会先暂停,按任意键后执行设置变量,然后又暂停,以此类推。 如果用户发现脚本在某一`pause`之前就闪退了,那可能是脚本开头就有语法错误。此时,可以尝试在脚本的最开始(第一行)就加入`pause`,然后运行。 如果用户无法修改脚本(比如闪退太快来不及修改),可以尝试以下方法: 1. 打开命令提示符(CMD)。 2. 将脚本拖拽到CMD窗口中(这样会得到完整路径)。 3. 在路径前输入`call `,然后按回车。例如: call "C:\path\to\ApacheBlockPerMin.bat" 4. 这样运行,即使脚本出错,窗口也不会立即关闭,可以看到错误信息。 另外,注意批处理脚本中的错误处理。有些命令失败会继续执行,有些会导致退出。可以使用`||`来捕获错误,例如: some_command || echo Error occurred. 如果脚本中使用了`exit /b`或`exit`且没有指定错误码,也可能导致退出。检查是否有条件语句直接退出了。 最后,如果脚本需要管理员权限,而用户没有以管理员身运行,也可能导致某些命令失败。尝试以管理员身运行CMD,然后执行脚本。 总结:调试批处理脚本闪退的关键在于捕获错误信息,通过暂停、回显、日志等方法定位问题。 生成相关问题: 1. 如何以管理员身运行批处理脚本? 2. 批处理脚本中如何捕获并处理错误? 3. 如何检查批处理脚本中的语法错误? 4. 批处理脚本中如何记录日志? 5. 批处理脚本中如何设置和使用环境变量? 6. 为什么我的批处理脚本在双击运行时闪退,但在命令行中运行正常?</think>### 调试 Windows 批处理脚本闪退问题(ApacheBlockPerMin.bat) 批处理脚本闪退通常由路径错误、权限不足、语法错误或环境问题导致。以下是系统化的调试步骤: #### 1. **基础调试(查看错误信息)** ```batch :: 在脚本第一行添加(临时修改) @echo on pause ``` - 运行方法:将脚本拖到CMD窗口执行(避免双击闪退) - 作用:显示每条命令执行结果,并在退出前暂停,可看到具体报错行[^1] #### 2. **关键检查点** ```batch :: 检查路径是否存在(示例) if not exist "C:\Apache\logs\access.log" ( echo [错误] 日志文件不存在!& pause exit /b 1 ) :: 检查外部命令可用性 where findstr >nul 2>&1 || ( echo [错误] findstr 命令不可用!& pause exit /b 1 ) ``` #### 3. **日志记录法(永久调试)** ```batch @echo off set LOGFILE=%~dp0debug.log call :main >> "%LOGFILE%" 2>&1 exit /b :main REM 实际脚本内容开始 set INTERVAL=60 for /f %%i in ('find /c "GET /block" C:\Apache\logs\access.log') do set COUNT=%%i ... ``` - 运行后在脚本同目录查看 `debug.log` 文件 #### 4. **常见故障原因排查表** | 问题类型 | 检查点 | 解决方案 | |-------------------|-------------------------------|----------------------------| | 路径错误 | Apache日志路径是否包含空格 | 用引号包裹路径 `"C:\Program Files\..."` | | 权限不足 | 脚本是否需管理员权限 | 右键→"以管理员身运行" | | 环境变量 | `PATH`是否包含Apache工具路径 | 脚本开头添加 `set PATH=...` | | 特殊字符 | 是否包含 `&`, `|` 等未转义字符 | 使用 `^` 转义(如 `^&`) | | 循环语法错误 | `for /f` 中的引号是否匹配 | 检查 `delims` 和 `tokens` | #### 5. **分模块测试** ```batch :: 单独测试统计模块 set TEST_LOG=access_sample.log echo Testing... > %TEST_LOG% for /f %%i in ('find /c "GET /block" %TEST_LOG%') do echo Count: %%i pause ``` #### 6. **高级调试工具** - 使用 `Process Monitor` 监控脚本行为: 1. 筛选 `Process Name` 为 `cmd.exe` 2. 观察文件/注册表访问错误 - 使用 `ERRORLEVEL` 检查: ```batch some_command if %errorlevel% neq 0 ( echo [错误] 命令执行失败,代码:%errorlevel% & pause ) ``` > **重要提示**:若脚本涉及日期计算(常见于按分钟统计),需检查区域日期格式差异: > ```batch > :: 统一为YYYY-MM-DD格式 > set "ISODATE=%date:~0,4%-%date:~5,2%-%date:~8,2%" > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值