使用 PowerShell 定时执行 .NET (C#) 程序的原理与方法

小鹿同学
小鹿同学
发布时间:2026-10-14| 7人浏览过
原创

在需要定期触发程序逻辑但缺乏复杂后台服务支持时,利用 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# 集成应用方面的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。