使用 PowerShell 定时执行 .NET (C#) 程序的原理与方法
在需要定期触发程序逻辑但缺乏复杂后台服务支持时,利用 Windows 自带的 PowerShell 进行轻量级调度是一种常用方案。本文演示如何编写 PowerShell 脚本来判断当前时间点是否处于指定时间窗口内,若满足条件则使用 .NET Framework 提供的 System.Net.WebClient 发送 HTTP 请求,从而实现类似“定时执行 C# 逻辑”的效果。
结果与目标
构建一个基于时间的检测脚本,当系统时间在设定范围内(如每小时的某个特定分钟区间),自动向指定 URL 发起请求并记录日志;否则保持静默等待下一个周期。此方法常用于轻量级的轮询机制或简单的任务唤醒。
准备条件
- 运行环境:Windows 操作系统(自带 PowerShell)。
- 核心库:
System.Net.WebClient属于 .NET Framework,Windows PowerShell 默认已加载该模块,可直接实例化。 - 权限:普通用户权限即可运行脚本,但需确保网络连接正常且能访问目标 URL。
真实操作顺序
第1步:定义时间判断逻辑
目的:确定当前时刻是否符合预设的执行时间段。
入口:新建文本文件并重命名为 Listen-Cms.ps1。
动作:获取当前系统时间,将其转换为从当日 0 点开始的总分钟数,并与设定的开始和结束分钟数进行比较。
$date = Get-Date;
$beginTime = 2 * 60 ; // 开始时间:02:00 对应的分钟数
$endTime = 2 * 60 + 11; // 结束时间:02:11 对应的分钟数
$minuteCount = $date.hour * 60 + $date.minute;
// 判断当前时间是否在 [beginTime, endTime] 区间内
if(($minuteCount -le $endTime ) -and ($minuteCount -ge $beginTime ))
{
# 执行具体逻辑
Write-Host "Time matched, proceeding...";
}
else
{
Write-Host "Not Update";
}
重要参数:$beginTime 和 $endTime 定义了触发的时间窗口。
可观察状态:控制台输出 “Not Update” 表示时间未到,后续步骤中的请求不会发生。
第2步:构建 HTTP 请求(C# / .NET 封装)
目的:在确认时间匹配后,模拟浏览器行为发起 Web 请求,触发后端 CMS 监听或数据处理逻辑。
入口:继续在 Listen-Cms.ps1 的时间判断分支内部添加代码。
动作:实例化 System.Net.WebClient 对象,设置必要的 Headers(如 User-Agent 和 Referer 以模拟真实请求),并调用 DownloadString 方法获取响应。
# 初始化 WebClient
$webClient = new-object System.Net.WebClient;
$webClient.Headers.Add("user-agent","PowerShell Script");
$webClient.Headers.Add("Referer","PowerShell Script");
$url = "https://www.jb51.net/enAdmin/Handler/Listen_cms.ashx?code=listen_cms_20111130876";
$message = $webClient.DownloadString($url);
# 写入日志
Write-Host "Message:"+$message;
注意:此处使用了传统的 new-object 语法以确保对旧版 PowerShell 环境的兼容性。在现代 PowerShell (v7+) 中也可以使用 [System.Net.WebClient]::new(),但 new-object 更为通用稳妥。
可观察状态:控制台输出目标 URL 返回的具体字符串内容。
第3步:控制执行频率
目的:避免脚本过于频繁地检查时间和发送请求,造成资源浪费或触发服务器的频率限制。
入口:脚本末尾。
动作:使用 Sleep 命令让进程挂起指定秒数,然后重新进入下一次循环(通常在外部由任务计划程序或 while 循环包裹调用)。
Sleep 5
完成判断:脚本执行暂停 5 秒,等待被再次调度。
第4步:通过 Bat 文件调用 PowerShell
目的:提供简易的启动方式,或通过 Windows Task Scheduler 调用该批处理文件来实现真正的定时触发(而非脚本内的 Sleep 轮询)。
入口:新建文本文件,重命名为 demo1.bat。
动作:编写一行代码调用刚才创建的 PowerShell 脚本。
powershell -ExecutionPolicy Bypass -File "%~dp0Listen-Cms.ps1"
修改说明:原文中的 %~sdp0Listen-Cms.ps1 写法较为隐蔽,建议使用标准的 -File 参数配合路径变量,确保脚本能正确加载。同时建议加入 -ExecutionPolicy Bypass 以避免因系统策略导致脚本无法运行的错误。
可观察状态:双击 .bat 文件,弹出窗口执行脚本并在完成后关闭或持续运行(取决于调用方式)。
完成判断
当时间戳落入 $beginTime 至 $endTime 之间时,服务器端应收到带有指定 Headers 的请求,并可通过后端日志确认为 PowerShell 脚本所发。若在非目标时间运行,脚本将仅输出信息或不执行请求,达到节能减耗的目的。
简要总结
虽然存在 WGet、curl 或系统任务计划程序等多种替代方案,但 PowerShell 因其强大的内置对象处理能力(如直接操作 .NET 类库)和灵活性,成为在 Windows 环境下快速实现此类轻量级自动化调度的优选工具。通过组合时间运算与网络请求类库,无需编译复杂的 C# 应用程序即可实现业务逻辑的定时触发。
以上就是 PowerShell 定时执行 .NET(C#) 程序方法的详细内容,更多关于 PowerShell 自动化与 C# 集成应用方面的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













