突发奇想 若有需重复定时运行完成的,如定时状态打印等,可以用延时后的自动化脚本完成.
通过不同方式的学习尝试和验证,总结如下:
一.虚拟机中的希尔脚本
#!/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