$sourceDirectory = "C:\FromDIR" $targetLocalDirectory = "D:\ToDIR" $btree = "数据库" $taskName = "HIS" $memo = "心电系统" # ---btree 为一级类目 比如 数据库 taskname 为 二级类目 比如 his---- memo 在详情页展示,显示具体的备注人读信息 # 将日志文件内容保存到 MSSQL Server 数据库 $connectionString = "Server=192.10.200.5;Database=BackupLogview;User ID=backupuser;Password=backusr" # ---------------------------------以下勿动!---------------------------------- # ----------------------------------------------------------------------------- $logDirectory = "C:\logs" # 设置脚本文件的编码为 UTF-8 $OutputEncoding = [System.Text.Encoding]::UTF8 # 创建日志文件夹 if (-not (Test-Path $logDirectory)) { New-Item -ItemType Directory -Path $logDirectory | Out-Null Write-Host "已创建文件夹: $logDirectory" } else { Write-Host "文件夹已存在: $logDirectory" } # 获取当前日期和时间 $datetime = Get-Date -Format "yyyyMMddHHmmss" $currentDate = $datetime.ToString() # 设置日志文件路径 $logFile = "$logDirectory\robocopy_log_$taskName_$currentDate.txt" # 设置 rem 日志文件路径 $remLogFile = "$logDirectory\rem_log_$taskName_$currentDate.txt" Write-Host "正在记录 rem 信息到 $remLogFile" # 执行 Robocopy 同步操作 robocopy $sourceDirectory $targetLocalDirectory /LOG:$logFile /NFL /TEE /E /XX /Z /R:3 /W:10 # robocopy D:\Document H:\Project /mir 完全拷贝并同步增删 /J 可以提高拷贝速度 ##自动删除备份文件夹中过时文件,慎用!尤其是拷贝断档的文件,请仅用于日常每日数据库日志备份自动删除! ## 获取文件夹中修改日期在一个月以上的文件,并删除它们 #$thresholdDate = (Get-Date).AddMonths(-1) #Get-ChildItem -Path $targetLocalDirectory | Where-Object { $_.LastWriteTime -lt $thresholdDate } | Remove-Item -Force $ipAddresses = Get-NetIPAddress | Where-Object { $_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -eq 'Manual' } | Select-Object -ExpandProperty IPAddress $ipAddressesString = $ipAddresses -join ',' # 等待 30 秒 Start-Sleep -Seconds 10 try { # 创建数据库连接对象 $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) # 打开数据库连接 $connection.Open() # 创建 SQL 命令对象 $command = $connection.CreateCommand() # 设置 SQL 命令文本 $command.CommandText = "INSERT INTO LogFiles (BTree, Tree, FileName, FileContent, memo) VALUES (@BTree, @Tree, @FileName, @FileContent,@memo)" # 添加参数 $command.Parameters.AddWithValue("@Tree", "$taskName") $command.Parameters.AddWithValue("@BTree", "$btree") $command.Parameters.AddWithValue("@FileName", "$logFile") $command.Parameters.AddWithValue("@memo", "$memo") # 读取日志文件内容 $logFileContent = Get-Content -Path $logFile -Raw # 附加上 IP 地址 $logFileContent = $logFileContent + $ipAddressesString $command.Parameters.AddWithValue("@FileContent", $logFileContent) # 执行 SQL 命令 $command.ExecuteNonQuery() Write-Host "日志文件内容已成功保存到数据库表。" } catch { Write-Host "发生错误: $($_.Exception.Message)" } finally { # 关闭数据库连接 $connection.Close() } # 删除日志文件 if (Test-Path $logFile) { Remove-Item -Path $logFile -Force Write-Host "已删除日志文件: $logFile" } else { Write-Host "未找到日志文件: $logFile" } # -------------------------以下仅适用于删除旧文件,保留5份最新文件的情况!---------------------- $folderPath = $targetLocalDirectory $fileExtension = ".bak" # 文件扩展名 $keepLatestCount = 5 # 保留的最新文件数量 # 获取文件列表并按照日期降序排序 $fileList = Get-ChildItem -Path $folderPath | Where-Object { $_.Extension -eq $fileExtension } | Sort-Object -Property LastWriteTime -Descending # 创建一个哈希表,用于存储不同文件的前缀和对应的文件列表 $filePrefixes = @{} # 遍历文件列表,将文件按前缀存入哈希表 foreach ($file in $fileList) { $fileName = $file.Name $filePrefix = $fileName -replace "_\d{4}-\d{2}-\d{2}.*$" if (-not $filePrefixes.ContainsKey($filePrefix)) { $filePrefixes[$filePrefix] = @() } $filePrefixes[$filePrefix] += $file } # 遍历哈希表,对每个前缀的文件列表进行处理,保留最新的文件数量 foreach ($prefixFiles in $filePrefixes.Values) { if ($prefixFiles.Count -gt $keepLatestCount) { $filesToDelete = $prefixFiles | Select-Object -Skip $keepLatestCount $filesToDelete | Remove-Item -Force } }
# -------------------------以下勿拷贝,备份参数仅供参考!----------------------
# -----------------------------------------------------------------------------
Usage: ROBOCOPY source destination [file [file]...] [options]
source 源路径(源文件夹)
destination目标路径(目标文件夹)
file 可选参数,指定要复制的特定文件(可以是通配符或文件名列表)
Options:
/S 复制子目录(包括空子目录)
/E 复制子目录(包括空子目录),连同目录树中的空目录一起复制
/Z 在网络连接出现故障时重新尝试
/R:n 在错误发生时重新尝试的次数(默认值为1,000,000)
/W:n 在错误发生时的等待时间(默认值为30秒)
/NFL 不记录文件列表
/NDL 不记录目录列表
/TEE 在屏幕上显示复制的输出
/LOG:file 将输出信息写入指定的日志文件
/XX排除已经存在于目标目录中的额外文件(根据文件大小和修改日期进行匹配)
/XL排除目标目录中已经存在于源目录中的额外文件和目录
/COPY:copyflags 复制文件的属性(默认值为DAT)
D - 日期
A - 属性
T - 时间
S - 安全
O - 拥有者信息
U - 重新启动数据:包括非数据流文件
M - 重新启动数据:不包括非数据流文件
B - 离线文件
/IS包括同样的文件
/IT包括更改的文件和时代