当前位置: 首页 > news >正文

Powershell批量压缩并上载CSV数据文件到Box企业云盘

PowerShell脚本,包含配置文件读取、批量压缩、异步上传、异常处理和日志记录功能:

<#
.SYNOPSIS
    CSV文件批量压缩并上传到Box的自动化脚本
.DESCRIPTION
    1. 读取INI配置文件参数
    2. 批量压缩指定目录的CSV文件
    3. 异步上传ZIP文件到Box企业云
    4. 完善的异常处理和日志记录
.NOTES
    Version: 1.1
    Author: AI助手
    Created: 2023-10-20
#>

# 配置文件解析函数
function Get-IniContent {
    param($FilePath)
    $ini = @{}
    switch -regex -file $FilePath {
        "^\[(.+)\]$" {
            $section = $matches[1]
            $ini[$section] = @{}
        }
        "^\s*([^#].+?)\s*=\s*(.*)" {
            $name,$value = $matches[1..2]
            $ini[$section][$name] = $value.Trim()
        }
    }
    return $ini
}

# 日志记录函数
function Write-Log {
    param(
        [string]$Message,
        [string]$Level = "INFO"
    )
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    Add-Content -Path $config["Settings"]["LogPath"] -Value $logEntry
    if ($Level -eq "ERROR") { Write-Host $logEntry -ForegroundColor Red }
    else { Write-Host $logEntry }
}

# Box上传函数
function Invoke-BoxUpload {
    param(
        [string]$FilePath,
        [string]$TargetPath
    )
    try {
        $headers = @{
            "Authorization" = "Bearer $($config['Box']['APIToken'])"
            "Content-Type" = "application/octet-stream"
        }
        
        $fileName = Split-Path $FilePath -Leaf
        $uploadUrl = "https://upload.box.com/api/2.0/files/content?parent_id=$TargetPath"
        
        $fileBytes = [System.IO.File]::ReadAllBytes($FilePath)
        $boundary = [System.Guid]::NewGuid().ToString()
        
        $body = (
            "--$boundary",
            "Content-Disposition: form-data; name=`"file`"; filename=`"$fileName`"",
            "Content-Type: application/octet-stream`r`n",
            [System.Text.Encoding]::UTF8.GetString($fileBytes),
            "--$boundary--"
        ) -join "`r`n"

        $response = Invoke-RestMethod -Uri $uploadUrl -Method Post -Headers $headers `
            -Body $body -ContentType "multipart/form-data; boundary=$boundary"
        
        return $response
    }
    catch {
        throw "Box上传失败: $_"
    }
}

# 主程序
try {
    # 读取配置文件
    $configPath = "config.ini"
    if (-not (Test-Path $configPath)) {
        throw "配置文件 $configPath 不存在"
    }
    $config = Get-IniContent $configPath

    # 验证必要参数
    $requiredParams = @{
        "Settings" = @("SourcePath", "ZipPath", "LogPath")
        "Box"     = @("APIToken", "TargetFolderID")
    }
    
    foreach ($section in $requiredParams.Keys) {
        foreach ($param in $requiredParams[$section]) {
            if (-not $config[$section][$param]) {
                throw "缺少必要参数 [$section] $param"
            }
        }
    }

    # 创建必要目录
    @($config["Settings"]["ZipPath"], (Split-Path $config["Settings"]["LogPath"])) | ForEach-Object {
        if (-not (Test-Path $_)) { New-Item -Path $_ -ItemType Directory -Force | Out-Null }
    }

    # 获取CSV文件
    $csvFiles = Get-ChildItem -Path $config["Settings"]["SourcePath"] -Filter *.csv
    if (-not $csvFiles) {
        Write-Log "未找到CSV文件,程序退出"
        exit
    }

    # 批量压缩
    $zipJobs = @()
    foreach ($file in $csvFiles) {
        try {
            $zipPath = Join-Path $config["Settings"]["ZipPath"] "$($file.BaseName).zip"
            Compress-Archive -Path $file.FullName -DestinationPath $zipPath -Force
            Write-Log "成功压缩: $($file.Name)$zipPath"
            
            # 异步上传
            $uploadJob = Start-Job -ScriptBlock {
                param($config, $zipPath)
                try {
                    $response = Invoke-BoxUpload -FilePath $zipPath -TargetPath $config["Box"]["TargetFolderID"]
                    [PSCustomObject]@{
                        Status  = "Success"
                        Message = "上传成功: $($response.entries[0].name)"
                        File    = $zipPath
                    }
                }
                catch {
                    [PSCustomObject]@{
                        Status  = "Error"
                        Message = $_.Exception.Message
                        File    = $zipPath
                    }
                }
            } -ArgumentList $config, $zipPath
            
            $zipJobs += $uploadJob
        }
        catch {
            Write-Log "压缩失败: $($file.Name) - $_" -Level ERROR
        }
    }

    # 处理上传结果
    $zipJobs | Wait-Job | ForEach-Object {
        $result = Receive-Job $_
        if ($result.Status -eq "Success") {
            Write-Log $result.Message
        }
        else {
            Write-Log "$($result.File) 上传失败: $($result.Message)" -Level ERROR
        }
    }

}
catch {
    Write-Log "主程序异常: $_" -Level ERROR
    exit 1
}
finally {
    Get-Job | Remove-Job -Force
    Write-Log "程序执行完成"
}

配置文件示例 (config.ini):

[Settings]
SourcePath=C:\CSVFiles
ZipPath=C:\ZIPArchive
LogPath=C:\Logs\FileUpload.log

[Box]
APIToken=your_box_api_token
TargetFolderID=1234567890  # Box目标文件夹ID

功能说明:

  1. 配置文件管理:

    • 使用INI格式配置文件
    • 支持路径配置和API令牌管理
    • 自动验证必要参数
  2. 压缩功能:

    • 自动遍历指定目录的CSV文件
    • 为每个CSV生成独立的ZIP文件
    • 支持覆盖已存在的ZIP文件
  3. 异步上传:

    • 使用PowerShell Jobs实现异步操作
    • 每个文件独立上传任务
    • 自动等待所有任务完成
  4. 日志功能:

    • 支持不同日志级别(INFO/ERROR)
    • 控制台颜色区分错误信息
    • 详细记录操作时间戳
  5. 异常处理:

    • 全局异常捕获
    • 文件级错误处理
    • 网络请求错误处理

使用说明:

  1. 创建配置文件config.ini
  2. 修改配置参数为实际值
  3. 以管理员身份运行脚本
  4. 查看生成的日志文件

注意事项:

  1. 需要PowerShell 5.1或更高版本
  2. Box API Token需要具有文件上传权限
  3. 确保网络可以访问Box API端点
  4. 大文件上传建议增加分块上传逻辑
  5. 可根据需要调整压缩级别和并发数

可以通过以下命令查看运行状态:

Get-Job | Format-Table -AutoSize

相关文章:

  • 基于Matlab的多目标粒子群优化
  • csrf与ssrf学习笔记
  • 使用WebSocket进行通信的图形用户界面应用程序
  • 004build在设计页面上的使用
  • 长时间目标跟踪算法(3)-GlobalTrack:A Simple and Strong Baseline for Long-termTracking
  • 【蓝桥杯单片机】第十二届省赛
  • 计算机毕业设计SpringBoot+Vue.js航空机票预定系统(源码+文档+PPT+讲解)
  • 信息技术知识赛系统设计与实现(代码+数据库+LW)
  • Metasploit multi/handler 模块高级选项解析
  • 如何在MacOS 10.15上安装Docker Desktop
  • JUnit 版本影响 Bean 找不到
  • 计算机视觉算法比较
  • Html5学习教程,从入门到精通,HTML5 列表语法知识点及案例代码(11)
  • 准备好了数据集之后,如何在ubuntu22.04上训练一个yolov8模型。
  • [Lc_Notes] hash去重 | find | string逐字符处理 | 栈溢出
  • 解决Docker拉取镜像超时错误,docker: Error response from daemon:
  • SpringBoot快速入门
  • Debian基于Hexo搭建个人博客
  • 最新版AI大模型面试八股文
  • 菜鸟之路Day21一一网络编程
  • 以色列总理:以哈谈判内容包括“结束战争的框架”
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?
  • 倒票“黄牛”屡禁不绝怎么破?业内:强化文旅市场票务公开制度
  • 原核试验基地司令员范如玉逝世,从事核试验研究超40年
  • 新任重庆市垫江县委副书记刘振已任县政府党组书记
  • 武康大楼再开发:一栋楼火还不够,要带火街区“朋友圈”