批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内]

news/2025/2/27 22:56:16/文章来源:https://www.cnblogs.com/sharpeye/p/18741943

想到一个情景。程序实时监测文件夹情况,如果有新文件进入,分析其文件名,然后如果满足预设条件,则做相应操作。比如扫描仪扫描了文件,会将新文件保存进特定文件夹内,可以使用该程序来做处理。

 

在Windows端最直接的就是用.bat批处理,当然使用Powershell或者C#、python语言平台更轻松专业,这里使用 .bat 实现。笔者喜欢窗口下,看着字符串一行行打印出来的感觉,啊哈哈~~~

 

【设计需求】

使用cmd实现:检测文件夹(D:\projects\cmd\targetdir) 内是否有新文件出现,如果有,查看该文件的文件名,如果是以A字符打头的,那么将该文件发送给远程文件夹(\\DESKTOP-JL8BQNM\temp4share) 程序不断地去检测,注意生成日志方便调式和日后维护。

 

【设计思路】

1.  要想监测文件夹内是否有新文件,需要对比当前的文件列表和之前的文件列表,如果有出入,则有增添删减文件

2.   把新文件名称记录下来,解析字符并做比较,得出满足条件的文件对象。

3.  将满足条件的文件拷贝到远程文件夹中。其中远程通讯需要双方都开启共享。

4.  每个关键操作需要概括为描述性字符,写入日志文件中。

5.  程序需要有死循环机制,让其不断监测,Ctrl+C 可退出。

 

【设计脚本】

首先必要的变量先定义好:

set "script_dir=%~dp0"    %定义当前脚本目录%
set "target_dir=D:\projects\cmd\targetdir"    %定义监测的目录地址%
set "remote_dir=\\DESKTOP-JL8BQNM\temp4share"    %定义远程的目录地址%
set "log_file=%script_dir%FileMonitor.log"    %日志文件存放地址%
set "check_interval=5"    %重新执行的间隔时间 5秒%

之后编写cmd界面,做必要解释:

echo ================================================
echo              █ 文件监控传输工具 █  
echo ================================================
echo   [版本特性]
echo   √ 严格匹配大写A开头文件 √ 特殊字符支持
echo   √ 实时传输状态提示   √ 详细日志记录
echo   监控目录    : "%target_dir%"
echo   远程目录    : "%remote_dir%"
echo   日志文件    : "%log_file%"
echo   检测间隔    : 每%check_interval%秒
echo ================================================
echo   [注意] 大文件传输时会暂停监控,保持窗口开启
echo   按 Ctrl+C 安全终止程序
echo ================================================

 然后,编写核心算法:

:: 生成初始文件快照
dir /b "%target_dir%" > "%script_dir%prevfiles.txt"

 再次生成文件快照,和之前的作对比:

dir /b "%target_dir%" > "%script_dir%currentfiles.txt"
findstr /v /g:"%script_dir%prevfiles.txt" "%script_dir%currentfiles.txt" > "%script_dir%newfiles.txt"

如果有新增文件,做对应处理:

for /f "usebackq tokens=*" %%f in ("%script_dir%newfiles.txt") do (call :process_file "%%~f"
)

提取文件名首字母:

set "first_char=!filename:~0,1!"

然后做判断,如果符合首字母"A",则做拷贝操作,如果不是忽略文件:

if "!first_char!"=="A" (color 0Aecho    符合条件:大写A开头文件echo    开始传输,请勿关闭窗口...:: 使用robocopy增强传输(显示进度但保持静默)robocopy "%target_dir%" "%remote_dir%" "!filename!" /njh /njs /ndl /nc /np:: 错误代码处理(ROBOCOPY特有代码)if errorlevel 8 (color 0Cecho    [严重错误] 代码!errorlevel! 磁盘空间不足echo [%timestamp%] ERROR: 传输失败 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 4 (color 0Eecho    [警告] 代码!errorlevel! 文件不匹配echo [%timestamp%] WARN: 传输异常 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 1 (color 0Aecho    [成功] 传输完成echo [%timestamp%] SUCCESS: 已传输 → "!safe_filename!" >> "%log_file%")color 0F
) else (echo    忽略:非大写A开头文件echo [%timestamp%] INFO: 忽略文件 → "!safe_filename!" >> "%log_file%"
)

因为想要生成日志,因此每做一个操作,获取时间并输入给 .log。

:get_timestamp
for /f "tokens=2 delims==." %%t in ('wmic os get localdatetime /value 2^>nul') do set "datetime=%%t"
set "timestamp=!datetime:~0,4!-!datetime:~4,2!-!datetime:~6,2! !datetime:~8,2!:!datetime:~10,2!:!datetime:~12,2!"

另外想要不断监测,程序需要循环执行:

rem ...
:: ==================== 主监控循环 =====================
:monitor_loop
call :get_timestamprem ...:: 间隔检测(非阻塞等待)
timeout /t %check_interval% /nobreak >nul
goto monitor_loop

 还有一些细节:

使用robocopy命令传输:

robocopy "%target_dir%" "%remote_dir%" "!filename!" /njh /njs /ndl /nc /np /ns /nfl
if errorlevel 8 (...错误处理...
)

更科学更安全,提升特殊字符处理能力,也可以返回错误信息。

  • ROBOCOPY错误代码表

代码 含义 处理建议
0 无变化 正常情况
1 文件复制成功 记录日志
4 不匹配文件 检查文件系统
8 磁盘空间不足 紧急处理
16 无效参数 检查脚本配置

因此可以对错误码进行逐一对比操作:

 :: 错误代码处理(ROBOCOPY特有代码)if errorlevel 8 (color 0Cecho    [严重错误] 代码!errorlevel! 磁盘空间不足echo [%timestamp%] ERROR: 传输失败 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 4 (color 0Eecho    [警告] 代码!errorlevel! 文件不匹配echo [%timestamp%] WARN: 传输异常 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 1 (color 0Aecho    [成功] 传输完成echo [%timestamp%] SUCCESS: 已传输 → "!safe_filename!" >> "%log_file%")

 还有特殊字符  &  的处理

set "safe_filename=!filename:^&=^^^&!"

避免文件名称有特殊字符。(实际上作为文件名,本身不允许特殊字符,这里做保险之用)

另外

@echo off:关闭命令回显,提升界面整洁度

setlocal enabledelayedexpansion:启用延迟变量扩展,正确处理动态变量,始终在脚本开头使用setlocal防止污染系统环境变量

title:自定义控制台窗口标题

color 0F & cls:设定白色文本并清空内容

还有时刻注意做日志备份信息。如:

echo [%timestamp%] INFO: 发现文件 → "!safe_filename!" >> "%log_file%"

 

完整脚本代码如下:

@echo off
setlocal enabledelayedexpansion
title 文件监控传输工具  V1.4:: ======================= 配置参数 ========================
set "script_dir=%~dp0"                    & rem 获取脚本所在目录
set "target_dir=D:\projects\cmd\targetdir" & rem 监控目录
set "remote_dir=\\DESKTOP-JL8BQNM\temp4share" & rem 远程目录
set "log_file=%script_dir%FileMonitor.log"  & rem 日志文件路径
set "check_interval=5"                     & rem 检测间隔(秒):: ====================== 初始化界面 =======================
color 0F & cls
echo ================================================
echo              █ 文件监控传输工具 █  
echo ================================================
echo   [版本特性]
echo   √ 严格匹配大写A开头文件 √ 特殊字符支持
echo   √ 实时传输状态提示   √ 详细日志记录
echo   监控目录    : "%target_dir%"
echo   远程目录    : "%remote_dir%"
echo   日志文件    : "%log_file%"
echo   检测间隔    : 每%check_interval%秒
echo ================================================
echo   [注意] 大文件传输时会暂停监控,保持窗口开启
echo   按 Ctrl+C 安全终止程序
echo ================================================:: ================== 文件列表初始化 ====================
dir /b "%target_dir%" > "%script_dir%prevfiles.txt":: ==================== 主监控循环 =====================
:monitor_loop
call :get_timestamp
echo [%timestamp%] 扫描进行中...:: 生成当前文件列表(安全模式)
dir /b "%target_dir%" > "%script_dir%currentfiles.txt":: 检测新增文件(增强模式)
findstr /v /g:"%script_dir%prevfiles.txt" "%script_dir%currentfiles.txt" > "%script_dir%newfiles.txt":: 处理新增文件(支持特殊字符)
for /f "usebackq tokens=*" %%f in ("%script_dir%newfiles.txt") do (call :process_file "%%~f"
):: 更新文件列表缓存
move /y "%script_dir%currentfiles.txt" "%script_dir%prevfiles.txt" >nul
del "%script_dir%newfiles.txt" 2>nul:: 间隔检测(非阻塞等待)
timeout /t %check_interval% /nobreak >nul
goto monitor_loop:: ================== 文件处理模块 =====================
:process_file
set "filename=%~1"
set "safe_filename=!filename:^&=^^^&!"  & rem 转义特殊字符:: 获取首字符(ASCII值方式更可靠)
set "first_char=!filename:~0,1!"
call :get_timestamp:: 日志记录(双重写入)
echo [%timestamp%] 发现文件: "!safe_filename!"
echo [%timestamp%] INFO: 发现文件 → "!safe_filename!" >> "%log_file%":: ============ 严格大写A检测(ASCII值65) =============
if "!first_char!"=="A" (color 0Aecho    符合条件:大写A开头文件echo    开始传输,请勿关闭窗口...:: 使用robocopy增强传输(显示进度但保持静默)robocopy "%target_dir%" "%remote_dir%" "!filename!" /njh /njs /ndl /nc /np:: 错误代码处理(ROBOCOPY特有代码)if errorlevel 8 (color 0Cecho    [严重错误] 代码!errorlevel! 磁盘空间不足echo [%timestamp%] ERROR: 传输失败 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 4 (color 0Eecho    [警告] 代码!errorlevel! 文件不匹配echo [%timestamp%] WARN: 传输异常 → "!safe_filename!" [代码!errorlevel!] >> "%log_file%") else if errorlevel 1 (color 0Aecho    [成功] 传输完成echo [%timestamp%] SUCCESS: 已传输 → "!safe_filename!" >> "%log_file%")color 0F
) else (echo    忽略:非大写A开头文件echo [%timestamp%] INFO: 忽略文件 → "!safe_filename!" >> "%log_file%"
)echo --------------------------------------------------------
exit /b:: ================== 时间戳生成模块 ====================
:get_timestamp
for /f "tokens=2 delims==." %%t in ('wmic os get localdatetime /value 2^>nul') do set "datetime=%%t"
set "timestamp=!datetime:~0,4!-!datetime:~4,2!-!datetime:~6,2! !datetime:~8,2!:!datetime:~10,2!:!datetime:~12,2!"
exit /bendlocal

 

【设计小结】

后期还可以优化程序,比如可以引入配置文件----config.ini,如:

[Settings]
TargetDir=D:\projects\cmd\targetdir
RemoteDir=\\DESKTOP-JL8BQNM\temp4share
CheckInterval=5

还有,对于转义算法,为了处理文件名称带有&字符:

set "safe_filename=!filename:^&=^^^&!"

!filename:原字符串=新字符串! 表示对变量 filename 进行字符串替换。

原字符串 是 ^&(实际匹配 & 符号)

新字符串 是 ^^^&(实际生成转义后的 ^&

转义逻辑:

原字符串 中的 ^&^ 在这里是转义符,表示要匹配实际的 & 符号。

新字符串 中的 ^^^&:第一个 ^ 转义第二个 ^,生成一个普通 ^,第三个 ^ 转义 &,生成 ^&

当然该操作仅转义了 & 符号,其他特殊字符如 |>< 仍需额外处理。

不过正常情况下,文件名称不应该出现特殊字符,所以不用深究。

还有对于:

for /f "usebackq tokens=*" %%f in ("%script_dir%newfiles.txt") do (

为了防止反引号和括号给文本处理带来干扰。

usebackq参数是为了反引号的正常处理,"%script_dir%newfiles.txt",加上双引号,防止括号被解析为命令的一部分,建议所有路径操作强制使用引号包裹,避免解析错误。

还可优化的部分:

1.  临时的prevfiles.txt文件可以不用展现出来,在退出程序前将其消除。

2.  拷贝文件实际上是阻塞程序继续监测的,如果可以,设置成非阻塞的。

3.  设置日志轮转,更科学得管理日志。

 

脚本可以作为一个轻量级解决方案案例,展现了实时监控逻辑的实现范式,为复杂系统开发提供了基础设计模式参考。希望给读者一些灵感。CMD,你老爹永远是你老爹~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 DeepSeek R1 和 Ollama 开发 RAG 系统

1.概述 掌握如何借助 DeepSeek R1 与 Ollama 搭建检索增强生成(RAG)系统。本文将通过代码示例,为你提供详尽的分步指南、设置说明,分享打造智能 AI 应用的最佳实践。 2.内容 2.1 为什么选择DeepSeek R1? 在这篇文章中,我们将探究性能上可与 OpenAI 的 o1 相媲美、但成本却…

[NCTF 2022]qrssssssssqrssssssss_revenge WP

[NCTF 2022]qrssssssss&qrssssssss_revenge WP[NCTF 2022]qrssssssss&qrssssssss_revenge WP 本来最近是想练习写 python 脚本的,无意之中刷到了这道题,看到是关于二维码的,于是正好研究一下。 看了官方 WP有些概念没怎么懂,又去借鉴了别人的二维码学习笔记,不过…

昆明理工大学25年材料工程考研预计调剂158人

--材测材料物理与化学材料学材料表征与分析材料工程F001现代材料测试技术F002材料成型技术基础864材料科学基础

7.4.1 Inception 块

白色的\(1\times 1\)卷积层是用来降低通道数的,蓝色的卷积层是用来学习特征的 大致解释一下这些数字是怎么分配的。现在我们的通道数是\(192\),于是我们假设最后输出的通道数是\(256\);考虑这些通道如何分配:我们知道\(3\times 3\)的卷积层性质很好(参数不算太多,学习能力…

Windows安装ollama运行deep seek R1模型+Page Assist浏览器插件本地使用

在Windows系统上安装Ollama并运行DeepSeek R1模型,同时结合Page Assist浏览器插件实现本地使用,可以按照以下步骤操作: 一、安装Ollama 下载Ollama: 访问Ollama官方网站,下载适用于Windows的版本。安装路径默认在c盘创建符号链接 原路径:C:\Users\18368\.ollama目标路径:…

上海海洋大学软件开发与创新课程设计作业

我给上学期其他同学的大作业添加了一些功能,已有的功能只有用户注册并填写账号密码,然后点击登录按钮成功登录 现在添加的新功能如下: 1,添加了一个真正可以选课的页面,添加了一些课程选项 2,可以存储用户选课的历史和方案 3,添加了一个管理员页面用于查看用户账号密码以…

Qwen2.5-0.5B siglip 预训练 / 微调实验

前言视频 | 仓库跟着教程做的,记录学习过程。 环境双卡 3090 24G CUDA 12.2 transformers 4.49概述 通过在 Qwen2.5-0.5B 和 siglip 之间训练一个中间层构造 VLM。作者提到首次微调时,只冻结了视觉模型的参数,导致阶梯状的 loss 曲线,即发生过拟合。应冻结文本和视觉模型的…

2025.2.27(Java的输出换行)

如图输出println,这个ln相当于输出完后自动换一次行。如图输出print,去掉ln不换行。

优化职工信息系统文件读写错误

该系统取自于大一时期的一个同班同学的期末大作业,该职工信息系统分别实现了职工信息的增删改查,以及计算职工的总工资和平均工资等功能。但是在编写了该系统之后,出现了一些问题,其中一个文件读写的问题我觉得需要进行改进,这个代码不能自己创建文本文档在指定的文件夹,…

PL端DDR4的MIG IP核配置及example design分析(个人记录)

第一种配置方法如下。按最高2666MHz配置,这边输入的参考时钟看个人板卡情况,我这边输入是200MHz。第二种配置方法如下。按2400MHz配置(需要换芯片型号),这边输入的参考时钟看个人板卡情况,我这边输入是200MHz。这边是输入时钟设置及输出时钟设置。我这边输入是差分时钟,…

Linux上部署deepseek-r1:7b模型

通过ollama在debian上安装部署deepseek-r1:7b模型。一、安装ollama框架 访问 ollama 官网,点击下载,选择 Linux,复制安装命令执行即可。二、下载并运行模型 选择 deepseek:7b 模型,复制安装命令执行即可。 (这里的模型参数大小,可根据自己的显存大小选择,可简单安装 0.5b…

LVI_SAM虚拟机安装复现(二)

0. 前言 前一篇文章里面,已经完成了 Ubuntu 18.04 和 ROS Melodic 的安装。 还没有安装好的读者,可以回去看这一篇文章。 前情概要: LVI_SAM虚拟机安装复现(一) 本文主要记录了GTSAM源码编译安装过程中经历的坑 警告:并非从零开始零基础教你安装 GTSAM 哦 GTSAM是一个开源…