0
点赞
收藏
分享

微信扫一扫

Microsoft 365 开发:用命令行统计 SharePoint Online 的文件路径和大小

51 CTO 博客:https://blog.51cto.com/13969817

作为SharePoint 的管理员,在管理 SharePoint Online 文档库时,了解文件的分布和大小信息通常非常有用。

本文将介绍如何使用命令行工具和 Python 脚本统计 SharePoint Online 中的文件路径和大小,帮助管理员更好地管理和优化文档存储。

在开始之前,需要准备以下内容:

  • Python 3.7 或更高版本
  • SharePoint Online 站点的访问权限
  • 安装必要的Python 库:office365-rest-python-client

我们将通过 SharePoint 的 REST API 来获取文档库中的文件信息,具体步骤如下:

  1. 连接到 SharePoint Online 站点
  2. 递归遍历文档库中的所有文件夹
  3. 收集每个文件的路径和大小信息
  4. 将结果输出到控制台和CSV 文件

下面是完整的 Python 脚本,可用于统计 SharePoint Online 文件信息:

import argparse
import csv
from office365.runtime.auth.user_credential import UserCredential
from office365.sharepoint.client_context import ClientContext
import os

def connect_to_sharepoint(site_url, username, password):
    """连接到SharePoint Online站点"""
    try:
        ctx = ClientContext(site_url).with_credentials(UserCredential(username, password))
        # 验证连接
        web = ctx.web
        ctx.load(web)
        ctx.execute_query()
        print(f"成功连接到 SharePoint 站点: {web.title}")
        return ctx
    except Exception as e:
        print(f"连接 SharePoint 失败: {str(e)}")
        return None

def get_files_in_folder(ctx, folder_url, files_list, base_path=""):
    """递归获取文件夹中的所有文件"""
    try:
        folder = ctx.web.get_folder_by_server_relative_url(folder_url)
        ctx.load(folder)
        ctx.execute_query()
        
        # 获取当前文件夹路径
        current_path = os.path.join(base_path, folder.properties["Name"])
        
        # 获取文件夹中的文件
        files = folder.files
        ctx.load(files)
        ctx.execute_query()
        
        for file in files:
            # 收集文件信息
            file_info = {
                "name": file.properties["Name"],
                "path": current_path,
                "full_path": os.path.join(current_path, file.properties["Name"]),
                "size_bytes": file.properties["Length"],
                "size_mb": round(file.properties["Length"] / (1024 * 1024), 2) if file.properties["Length"] else 0
            }
            files_list.append(file_info)
            print(f"发现文件: {file_info['full_path']} ({file_info['size_mb']} MB)")
        
        # 递归处理子文件夹
        sub_folders = folder.folders
        ctx.load(sub_folders)
        ctx.execute_query()
        
        for sub_folder in sub_folders:
            # 跳过特殊文件夹
            if sub_folder.properties["Name"] not in ["Forms"]:
                get_files_in_folder(ctx, sub_folder.properties["ServerRelativeUrl"], files_list, current_path)
                
    except Exception as e:
        print(f"处理文件夹 {folder_url} 时出错: {str(e)}")

def save_to_csv(files_list, output_file):
    """将文件信息保存到CSV文件"""
    try:
        with open(output_file, mode='w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=["name", "path", "full_path", "size_bytes", "size_mb"])
            writer.writeheader()
            for item in files_list:
                writer.writerow(item)
        print(f"文件信息已保存到 {output_file}")
    except Exception as e:
        print(f"保存CSV文件失败: {str(e)}")

def print_summary(files_list):
    """打印统计摘要"""
    if not files_list:
        print("未找到任何文件")
        return
        
    total_files = len(files_list)
    total_size_bytes = sum(file["size_bytes"] for file in files_list)
    total_size_mb = round(total_size_bytes / (1024 * 1024), 2)
    total_size_gb = round(total_size_mb / 1024, 2)
    
    print("\n===== 统计摘要 =====")
    print(f"总文件数: {total_files}")
    print(f"总大小: {total_size_bytes} 字节")
    print(f"总大小: {total_size_mb} MB")
    print(f"总大小: {total_size_gb} GB")
    
    # 最大的5个文件
    largest_files = sorted(files_list, key=lambda x: x["size_bytes"], reverse=True)[:5]
    print("\n最大的5个文件:")
    for i, file in enumerate(largest_files, 1):
        print(f"{i}. {file['full_path']} - {file['size_mb']} MB")

def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='统计SharePoint Online文档库中的文件路径和大小')
    parser.add_argument('--site-url', required=True, help='SharePoint站点URL')
    parser.add_argument('--username', required=True, help='SharePoint登录用户名')
    parser.add_argument('--password', required=True, help='SharePoint登录密码')
    parser.add_argument('--library', required=True, help='文档库名称')
    parser.add_argument('--output', default='sharepoint_files.csv', help='输出CSV文件路径')
    
    args = parser.parse_args()
    
    # 连接到SharePoint
    ctx = connect_to_sharepoint(args.site_url, args.username, args.password)
    if not ctx:
        return
    
    # 获取文档库根目录
    library_url = f"/sites/{args.site_url.split('/sites/')[1]}/{args.library}" if "/sites/" in args.site_url else f"/{args.library}"
    
    # 收集文件信息
    files_list = []
    print(f"开始扫描 {args.library} 文档库...")
    get_files_in_folder(ctx, library_url, files_list)
    
    # 保存结果并打印摘要
    save_to_csv(files_list, args.output)
    print_summary(files_list)

if __name__ == "__main__":
    main()
    

使用方法

使用命令行运行脚本,需要提供以下参数:

python sharepoint_file_stats.py --site-url "https://your-tenant.sharepoint.com/sites/your-site" --username "your-email@domain.com" --password "your-password" --library "Documents" --output "file_stats.csv"

参数说明:

  • --site-url:SharePoint 站点的完整
  • --username: 用登录的用户名(通常是邮箱)
  • --password:登录密码(如果启用了MFA,可能需要使用应用密码)
  • --library:要统计的文档库名称
  • --output: 输出 CSV 文件的路径(可选,默认是 sharepoint_files.csv)

代码解析

  1. 连接SharePoint:使用office365-rest-python-client库建立与SharePoint Online 的连接,验证用户凭据
  2. 递归遍历文件:get_files_in_folder函数递归遍历文档库中的所有文件夹和文件,收集文件的名称、路径和大小信息
  3. 数据处理:将收集到的文件信息保存到CSV 文件,并生成统计摘要,包括总文件数、总大小和最大的 5 个文件
  4. 命令行接口:使用argparse库处理命令行参数,使脚本更易于使用

注意事项:如果你的 SharePoint 环境启用了多因素认证(MFA),直接使用密码可能无法登录,此时需要创建应用密码或使用其他认证方式

通过这个脚本,你可以快速获取 SharePoint Online 文档库的文件统计信息,有助于进行存储管理、清理不必要的大文件,以及了解文件分布情况。

 

举报

相关推荐

0 条评论