from __future__ import annotations import argparse from pathlib import Path def _validate_batch_input(value: str) -> str: suffix = Path(value).suffix.lower() if suffix not in {".csv", ".xlsx"}: raise argparse.ArgumentTypeError("batch 输入文件仅支持 .csv 或 .xlsx") return value def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="AD 用户自动化创建工具") parser.add_argument("--config", default="config/config.yaml", help="yaml 配置文件路径") subparsers = parser.add_subparsers(dest="command", required=True) interactive_parser = subparsers.add_parser("interactive", help="交互式创建 AD 用户") interactive_parser.add_argument("--dry-run", action="store_true", help="仅演练,不写入 LDAP") batch_parser = subparsers.add_parser("batch", help="批量创建 AD 用户") batch_parser.add_argument("--input", required=True, type=_validate_batch_input, help="输入文件(.csv/.xlsx)") batch_parser.add_argument("--dry-run", action="store_true", help="仅演练,不写入 LDAP") batch_parser.add_argument( "--continue-on-error", choices=["true", "false"], default="true", help="遇错是否继续处理后续行", ) init_parser = subparsers.add_parser("init-state", help="初始化状态文件") init_parser.add_argument("--dry-run", action="store_true", help="仅打印,不落盘") return parser