注意保存为 .ps1 后缀的文件
$sourceDirectory = "C:\FromDIR"
$targetLocalDirectory = "D:\ToDIR"
$btree = "数据库"
$taskName = "HIS"
$memo = "心电系统"
# ---btree 为一级类目 比如 数据库 taskname 为 二级类目 比如 his---- memo 在详情页展示,显示具体的备注人读信息
# ---------------------------------以下勿动!----------------------------------
# -----------------------------------------------------------------------------
$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
# 将日志文件内容保存到 MSSQL Server 数据库
$connectionString = "Server=192.10.203.204;Database=BackUpLog;User ID=backupuser;Password=backupuser"
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包括更改的文件和时代