定时打印的练习整理

突发奇想 若有需重复定时运行完成的,如定时状态打印等,可以用延时后的自动化脚本完成.

通过不同方式的学习尝试和验证,总结如下:

一.虚拟机中的希尔脚本

复制代码
#!/bin/bash

# 1. 配置参数
START_TIME="14:00:00"
END_TIME="15:00:00"
INTERVAL=10  # 每 10 秒运行一次

# 日志文件(可选,方便排查)
LOG="/E:/app/音乐/test_run.log"
# 确保脚本使用 UTF-8 编码
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 2. 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S'))] $*" >> "$LOG"
}

# 3. 检查是否已过截止时间
current_time=$(date '+%H:%M:%S')
if [[ "$current_time" > "$END_TIME" ]]; then
    log "当前时间 $current_time > $END_TIME,已超过运行截止时间,不执行。"
    exit 0
fi

# 4. 检查是否已到开始时间
if [[ "$current_time" < "$START_TIME" ]]; then
    log "当前时间 $current_time < $START_TIME,尚未到达开始时间,等待中..."
    # 等待到 14:00
    while [[ "$(date '+%H:%M:%S')" < "$START_TIME" ]]; do
        sleep 1
    done
    log "已到达 14:00,开始执行任务。"
fi

# 5. 主循环:每 10 秒打印一次,直到 15:00
while true; do
    current_time=$(date '+%H:%M:%S')
    # 检查是否超过结束时间
    if [[ "$current_time" > "$END_TIME" ]]; then
        log "已到达 15:00,任务结束。"
        break
    fi

    # 打印内容
    echo "你好,世界!"
    echo "这是中文测试"
    echo "当前时间:$(date '+%Y-%m-%d %H:%M:%S'))"

    # 写入日志
    log "打印成功:你好,世界! | 这是中文测试 | 时间:$(date '+%Y-%m-%d %H:%M:%S'))"

    # 等待 10 秒
    sleep $INTERVAL
done

# 6. 任务结束
log "脚本执行完毕,已成功运行 60 分钟。"

附:若是不能显示中文vim test.sh

:set fileformat=unix 再保存退出

二.用python环境来实现

复制代码
import time
import datetime

# 配置参数
start_time = "14:00:00"
end_time = "15:00:00"
interval = 10  # 秒
log_file = "test_run.log"

# 设置日志
def log(message):
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(f"[{timestamp}] {message}\n")
    print(f"[{timestamp}] {message}")

# 检查是否已过结束时间
current = datetime.datetime.now().strftime("%H:%M:%S")
if current > end_time:
    log(f"当前时间 {current} > {end_time},已超过运行截止时间,不执行。")
    exit()

# 等待到开始时间
if current < start_time:
    log(f"当前时间 {current} < {start_time},尚未到达开始时间,等待中...")
    while datetime.datetime.now().strftime("%H:%M:%S") < start_time:
        time.sleep(1)
    log("已到达 14:00,开始执行任务。")

# 主循环
log("任务开始:从 14:00 到 15:00,每 10 秒输出一次。")
while True:
    current = datetime.datetime.now().strftime("%H:%M:%S")
    if current > end_time:
        log("已到达 15:00,任务结束。")
        break

    # 打印内容
    print("你好,世界!")
    print("这是中文测试")
    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    # 写入日志
    log("打印成功:你好,世界! | 这是中文测试 | 时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    time.sleep(interval)

log("脚本执行完毕,已成功运行 60 分钟。")

三.直接在windows上尝试

1.test.ps1

复制代码
# ===================================================
# 脚本名称:test.ps1
# 功能:从 14:00 到 15:00,每 10 秒输出一次
# 支持中文,日志保存在 E:\app\音乐\test_run.log
# ===================================================

# 1. 配置参数
$StartTime = "14:00:00"
$EndTime = "15:00:00"
$Interval = 10  # 秒
$LogPath = "E:\app\音乐\test_run.log"

# 设置中文支持(UTF-8 + BOM)
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 2. 日志函数
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp] $Message" | Out-File -FilePath $LogPath -Append -Encoding UTF8
}

# 3. 检查是否已过截止时间
$current = Get-Date -Format "HH:mm:ss"
if ($current -gt $EndTime) {
    Write-Log "当前时间 $current > $EndTime,已超过运行截止时间,不执行。"
    exit
}

# 4. 等待到开始时间
if ($current -lt $StartTime) {
    Write-Log "当前时间 $current < $StartTime,尚未到达开始时间,等待中..."
    while ((Get-Date -Format "HH:mm:ss") -lt $StartTime) {
        Start-Sleep -Seconds 1
    }
    Write-Log "已到达 14:00,开始执行任务。"
}

# 5. 主循环:每 10 秒打印一次,直到 15:00
Write-Log "任务开始:从 14:00 到 15:00,每 10 秒输出一次。"

while ($true) {
    $current = Get-Date -Format "HH:mm:ss"
    
    if ($current -gt $EndTime) {
        Write-Log "已到达 15:00,任务结束。"
        break
    }

    # 打印内容(支持中文)
    Write-Host "你好,世界!"
    Write-Host "这是中文测试"
    Write-Host "当前时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'))"

    # 写入日志(支持中文)
    Write-Log "打印成功:你好,世界! | 这是中文测试 | 时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'))"

    # 等待 10 秒
    Start-Sleep -Seconds $Interval
}

# 结束日志
Write-Log "脚本执行完毕,已成功运行 60 分钟。"

# ===================================================
# 脚本名称:test.ps1
# 功能:从14点到15点,每10秒输出一次
# 支持中文,日志记录完整,自动创建目录
# ===================================================

# 1. 配置参数
$StartTime = "14:00:00"
$EndTime = "15:00:00"
$Interval = 10  # 秒
$LogPath = "E:\app\音乐\test_run.log"

# 2. 确保日志目录存在
$logDir = Split-Path $LogPath -Parent
if (!(Test-Path $logDir)) {
    New-Item -ItemType Directory -Path $logDir -Force | Out-Null
    Write-Host " 日志目录已创建:$logDir" -ForegroundColor Green
}

# 3. 日志函数(使用UTF8编码,支持中文)
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp - $Message" | Out-File -FilePath $LogPath -Append -Encoding UTF8
}

# 4. 时间转换函数:将"HH:mm:ss"转为TimeSpan
function Convert-ToTimeSpan {
    param([string]$Time)
    $parts = $Time -split ":"
    if ($parts.Count -ne 3) { throw "时间格式错误:$Time" }
    [TimeSpan]::new([int]$parts[0], [int]$parts[1], [int]$parts[2])
}

# 5. 主逻辑:使用try-catch捕获异常,确保脚本稳定运行
try {
    # 转换开始/结束时间为TimeSpan
    $startTimeSpan = Convert-ToTimeSpan $StartTime
    $endTimeSpan = Convert-ToTimeSpan $EndTime

    # 获取当前时间(仅时分秒)
    $currentTime = (Get-Date).TimeOfDay

    # 检查是否已过截止时间
    if ($currentTime -gt $endTimeSpan) {
        Write-Log "当前时间 $(Get-Date -Format 'HH:mm:ss') > $EndTime,已超过运行截止时间,不执行。"
        exit
    }

    # 等待到开始时间(如果还没到)
    if ($currentTime -lt $startTimeSpan) {
        $waitSeconds = ($startTimeSpan - $currentTime).TotalSeconds
        Write-Log "当前时间 $(Get-Date -Format 'HH:mm:ss') < $StartTime,尚未到达开始时间,等待 $([math]::Round($waitSeconds, 1)) 秒..."
        Start-Sleep -Seconds $waitSeconds
        Write-Log " 已到达 $StartTime,开始执行任务。"
    }

    # 主循环:每10秒输出一次,直到15点
    Write-Log " 任务开始:从 $StartTime 到 $EndTime,每 $Interval 秒输出一次。"
    $iteration = 0

    while ($true) {
        $iteration++
        $currentTime = (Get-Date).TimeOfDay

        # 检查是否到达结束时间
        if ($currentTime -gt $endTimeSpan) {
            Write-Log " 已到达 $EndTime,任务结束。"
            break
        }

        # 打印内容(支持中文,彩色输出)
        $currentDateTime = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
        Write-Host " 第 $iteration 次执行 - 当前时间:$currentDateTime" -ForegroundColor Cyan
        Write-Host " 你好,世界!" -ForegroundColor Green
        Write-Host " 这是中文测试" -ForegroundColor Yellow

        # 写入日志(包含完整信息)
        Write-Log "第 $iteration 次执行 - 打印成功:你好,世界! | 这是中文测试 | 时间:$currentDateTime"

        # 等待指定间隔
        Start-Sleep -Seconds $Interval
    }

    # 结束日志:统计总运行时间
    $totalMinutes = [math]::Round($iteration * $Interval / 60, 1)
    Write-Log " 脚本执行完毕,共执行 $iteration 次,总运行时间约 $totalMinutes 分钟。"
}
catch {
    Write-Log " 脚本执行出错:$($_.Exception.Message)"
    Write-Host " 错误:$($_.Exception.Message)" -ForegroundColor Red
}

2.test.bat

复制代码
@echo off
:: ===================================================
::  一键运行脚本:从 14:00 到 15:00,每 10 秒输出一次
::  支持中文,日志保存在 E:\app\音乐\test_run.log
::  纯批处理,无需 PowerShell,无需额外工具
:: ===================================================

:: 设置 UTF-8 编码
chcp 65001 >nul

:: 定义日志路径
set "LOG_DIR=E:\app\音乐"
set "LOG_FILE=%LOG_DIR%\test_run.log"

:: 创建目录(如果不存在)
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

:: 清空日志
echo. > "%LOG_FILE%"

:: 输出启动信息
echo.
echo [启动时间: %date% %time%]
echo [正在等待 14:00...]
echo [日志路径: %LOG_FILE%]
echo.

:: 等待到 14:00
:wait_loop
for /f "tokens=1-4 delims=:" %%a in ("%time%") do (
    set hour=%%a
    set min=%%b
    set sec=%%c
)

if %hour% == 14 (
    if %min% == 00 (
        goto start_loop
    )
)
timeout /t 1 >nul
goto wait_loop

:: 开始主循环
:start_loop
echo.
echo [开始运行: %date% %time%]
echo [每 10 秒输出一次,直到 15:00]
echo.

:: 循环计数器
set count=0

:loop
:: 获取当前时间
for /f "tokens=1-4 delims=:" %%a in ("%time%") do (
    set hour=%%a
    set min=%%b
    set sec=%%c
)

:: 构建输出内容
set "output=你好,世界!
这是中文测试
当前时间:%date% %time%
"

:: 写入日志(支持多行)
echo [%date% %time%] 你好,世界! >> "%LOG_FILE%"
echo [%date% %time%] 这是中文测试 >> "%LOG_FILE%"
echo [%date% %time%] 当前时间:%date% %time% >> "%LOG_FILE%"

:: 检查是否到达 15:00
if %hour% == 15 (
    if %min% == 00 (
        goto end_script
    )
)

:: 显示内容
echo 你好,世界!
echo 这是中文测试
echo 当前时间:%date% %time%

:: 等待 10 秒
timeout /t 10 >nul
set /a count+=1

goto loop

:end_script
echo.
echo [脚本执行完毕:已成功运行 60 分钟]
echo [任务结束时间: %date% %time%]
echo [日志文件: %LOG_FILE%]

:: 写入结束日志
echo [%date% %time%] 脚本执行完毕,已成功运行 60 分钟。 >> "%LOG_FILE%"

pause
相关推荐
大聪明-PLUS3 小时前
6 个 Docker 高级功能
linux·嵌入式·arm·smarc
南棱笑笑生3 小时前
20251028在荣品RD-RK3588-MID开发板的Android13系统下解决关机的时候最近打开的应用不关的问题
开发语言·python·rockchip
红树林073 小时前
BeautifulSoup 的页面中需要获取某个元素的 xpath 路径
前端·python·网络爬虫·beautifulsoup
半梦半醒*3 小时前
zookeeper + kafka
linux·分布式·zookeeper·kafka·centos·运维开发
阿巴~阿巴~3 小时前
深入理解sigaction函数:Linux信号处理机制与使用指南
linux·运维·服务器·信号处理
jieyu11193 小时前
Python 实战:Web 漏洞 Python POC 代码及原理详解(1)
python·web安全
QQLOVEYY4 小时前
Python和PyCharm的安装教程
python·pycharm
_dindong4 小时前
Linux网络编程:进程间关系和守护进程
linux·运维·服务器·网络·c++·学习
zhilin_tang4 小时前
如何写一个WebRTC ACE音频应用处理模块
linux·c语言·c++