用C++实现日常自动化:编写节省时间的脚本

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

您的C++——不仅仅是游戏和驱动程序

\n\n

当听到“C++”时,人们常常想到重型武器:Unreal引擎、操作系统、高负载服务器。但还有另一个同样有用的方面——用C++实现任务自动化。当同事们编写一次性Bash脚本或为Python依赖而苦恼时,您可以构建一个紧凑、快速的实用工具,它能在无需更新解释器的情况下稳定运行多年。

\n\n

在本文中,我将展示如何将C++变成自动化的瑞士军刀。我们将分析真实案例:从批量重命名文件到日志解析和报告生成。您将看到,用C++实现日常自动化并不复杂,而且在速度和可靠性方面非常划算。

\n\n

为什么选择C++,而不是Python或Bash?

\n\n

每种语言都有其用武之地。但在某些场景下,C++更具优势:

\n\n
    \n
  • 执行速度。 如果您处理的是TB级别的日志——每一毫秒都至关重要。
  • \n
  • 无依赖。 一个静态编译的二进制文件可在任何Linux/Windows上运行,无需安装解释器。
  • \n
  • 类型安全。 运行时意外更少——对于按计划运行的自动化任务至关重要。
  • \n
  • 系统访问。 直接操作WinAPI、POSIX、注册表、进程——无需中间层。
  • \n
\n\n

当然,对于快速原型开发,Python更方便。但当脚本成为CI/CD或生产基础设施的一部分时,用C++实现自动化会带来百倍回报。

\n\n

工具集:需要了解什么

\n\n

对于我们的任务,不需要完整的C++20。掌握基础就足够了:

\n\n
    \n
  • std::filesystem (C++17) — 文件和文件夹操作
  • \n
  • std::regex — 文本解析
  • \n
  • std::fstream / std::stringstream — 读写操作
  • \n
  • std::chrono — 时间测量和日志记录
  • \n
\n\n

编译时使用 -std=c++17 标志(对于MSVC使用 /std:c++17)。

\n\n

示例1:批量重命名文件

\n\n

假设您有一个包含照片的文件夹 IMG_001.jpg、IMG_002.jpg……需要将它们重命名为 2025_01_15_001.jpg 格式。手动操作——10分钟枯燥的工作。用脚本——0.2秒。

\n\n

代码

\n
#include <iostream>\n#include <filesystem>\n#include <regex>\n#include <string>\n\nnamespace fs = std::filesystem;\n\nint main() {\n    std::string dir_path = "./photos";\n    std::regex pattern(R"(IMG_(\\d+)\\.jpg)");\n    std::string prefix = "2025_01_15_";\n\n    for (auto &entry : fs::directory_iterator(dir_path)) {\n        std::string filename = entry.path().filename().string();\n        std::smatch match;\n\n        if (std::regex_match(filename, match, pattern)) {\n            std::string new_name = prefix + match[1].str() + ".jpg";\n            fs::rename(entry.path(), entry.path().parent_path() / new_name);\n            std::cout << "Renamed: " << filename << " -> " << new_name << "\\n";\n        }\n    }\n    return 0;\n}
\n\n

这个示例展示了如何通过用C++实现任务自动化,借助 std::filesystem 和正则表达式,用几行代码解决日常问题。您可以轻松地将其适配到自己的模式。

\n\n

示例2:日志解析和错误计数

\n\n

假设服务器以如下格式写入日志:

\n
2025-01-15 10:23:45 [ERROR] Database connection failed\n2025-01-15 10:23:46 [INFO] Retry #1\n2025-01-15 10:23:47 [ERROR] Timeout exceeded
\n\n

我们需要收集统计信息:每种类型的错误数量,并输出出现频率最高的前5条消息。Bash单行命令可以处理,但如果日志有GB级别——C++会快得多。

\n\n

代码

\n
#inc                

博客

书籍推荐