文章

windows:下载文件时触发任务

windows:下载文件时触发任务

在 Windows 中,可以使用 PowerShellFileSystemWatcher 类来监控指定文件夹的文件创建事件,并在检测到新文件时触发脚本。以下是详细步骤和代码示例:


方法 1:直接运行 PowerShell 监控脚本

步骤 1:创建 PowerShell 监控脚本

将以下代码保存为 FileWatcher.ps1(例如在 C:\Scripts\FileWatcher.ps1):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 定义要监控的文件夹路径
$watchFolder = "C:\Users\YourUsername\Downloads"  # 替换为你的目标文件夹

# 定义要触发的脚本路径(可以是 .ps1、.bat 或 .exe)
$scriptToRun = "C:\Scripts\ProcessFile.ps1"  # 替换为你的脚本路径

# 创建 FileSystemWatcher 对象
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $watchFolder
$watcher.Filter = "*.*"  # 监控所有文件,可以改成 "*.pdf" 等特定类型
$watcher.IncludeSubdirectories = $false  # 是否监控子文件夹
$watcher.EnableRaisingEvents = $true  # 启用事件监听

# 定义文件创建时的动作
$action = {
    $filePath = $Event.SourceEventArgs.FullPath
    $changeType = $Event.SourceEventArgs.ChangeType
    $fileName = $Event.SourceEventArgs.Name

    Write-Host "检测到新文件: $fileName ($changeType)"
    
    # 调用你的脚本,并传递文件路径作为参数
    Start-Process "powershell.exe" -ArgumentList "-File `"$scriptToRun`" `"$filePath`""
}

# 注册事件(当文件创建时触发)
Register-ObjectEvent $watcher "Created" -Action $action

# 保持脚本运行
Write-Host "正在监控文件夹: $watchFolder"
Write-Host "按 Ctrl+C 停止监控..."
try {
    while ($true) {
        Start-Sleep -Seconds 1  # 防止脚本退出
    }
}
finally {
    # 清理(按 Ctrl+C 后取消监控)
    $watcher.EnableRaisingEvents = $false
    $watcher.Dispose()
    Write-Host "监控已停止。"
}

步骤 2:创建被触发的脚本

例如,创建 C:\Scripts\ProcessFile.ps1,用于处理新文件:

1
2
3
4
5
6
7
8
9
10
param (
    [string]$filePath  # 接收传递的文件路径
)

Write-Host "正在处理文件: $filePath"
# 在这里编写你的处理逻辑,例如:
# - 移动文件
# - 解压文件
# - 调用其他程序
Move-Item -Path $filePath -Destination "C:\ProcessedFiles\" -Force

步骤 3:运行监控脚本

  1. 以管理员身份打开 PowerShell(避免权限问题)。
  2. 运行:
    1
    2
    
    Set-ExecutionPolicy RemoteSigned -Scope Process  # 允许脚本运行(临时)
    C:\Scripts\FileWatcher.ps1
    
  3. 现在,往 C:\Users\YourUsername\Downloads 放入文件时,ProcessFile.ps1 会自动执行。

方法 2:使用 Windows 任务计划程序(后台运行)

如果希望监控脚本在后台长期运行(即使关闭 PowerShell),可以结合 Windows 任务计划程序

步骤 1:创建启动脚本的快捷方式

  1. 新建一个 .bat 文件(如 StartWatcher.bat):
    1
    2
    
    @echo off
    powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\FileWatcher.ps1"
    

步骤 2:设置任务计划程序

  1. 打开 任务计划程序taskschd.msc)。
  2. 创建任务:
    • 触发器登录时系统启动时
    • 操作:启动 StartWatcher.bat
    • 勾选 使用最高权限运行(避免权限问题)。
  3. 任务会随系统启动,并在后台监控文件夹。

注意事项

  1. 文件完整性:大文件可能未完全下载就被触发,建议在脚本中增加延迟检查(如 Start-Sleep -Seconds 5)。
  2. 避免重复触发:某些程序(如浏览器)可能先创建临时文件再重命名,导致多次触发,可以过滤特定扩展名(如 $watcher.Filter = "*.pdf")。
  3. 日志记录:可以在 ProcessFile.ps1 中增加日志功能,方便排查问题:
    1
    
    Add-Content -Path "C:\Scripts\log.txt" -Value "$(Get-Date) 处理文件: $filePath"
    

总结

方法适用场景优点缺点
直接运行 PowerShell临时测试简单直接关闭窗口后停止
任务计划程序长期后台运行开机自启需额外配置

选择适合你的方式即可实现 文件监控 + 自动触发脚本

本文由作者按照 CC BY 4.0 进行授权