我们需要一个 powershell 脚本来从 3 个远程服务器备份文件夹:
服务器1 服务器2 服务器3
每个远程服务器上的源路径相同:c:\backupfiles
发送到包含每个文件夹当天日期的中央本地文件夹:c:\allbackups\server1<DATE> c:\allbackups\server2<DATE> c:\allbackups\server3<DATE>
最干净的方法是什么?谢谢,
答案1
这是完成这项工作的方法。[咧嘴笑] 它比所要求的要多一点,但由于缺乏适当的错误处理,因此尚未完全填写。无论如何......这是它的作用......
- 创建服务器计算机列表
- 设置各种常量
- 创建目标根目录
这里是一个“缺乏错误处理”的点 - 没有检查确保该目录已创建并且可写。 - 遍历计算机列表
- 检查远程源目录
- 如果不存在,则在屏幕上
另一个缺少的地方写入警告。您可能需要将缺少的源添加到 $Var 或错误文件中。 - 如果是的话...
- 建立完整备份目标目录
- 创建它并忽略任何错误,
这又是一个糟糕的错误处理。[叹息……] - 将参数构建
robocopy
到数组中 - 使用上述参数 splat 调用 RC
来查找Get-Help about_Splatting
真正巧妙的功能。[咧嘴笑] - 完成对计算机列表的迭代
代码 ...
$ComputerList = @(
'LocalHost'
'127.0.0.1'
$env:COMPUTERNAME
)
# swap the `#` on these two lines to test "no source found"
$SourceDir = 'd$\Temp'
#$SourceDir = 'd$\Temp\NotThere'
$RootDestDir = "$env:TEMP\Backups"
if (-not (Test-Path -LiteralPath $RootDestDir))
{
$Null = New-Item -Path $RootDestDir -ItemType 'Directory'
}
$FileSpec = '*.*'
$TimeStamp = (Get-Date).ToString('yyyy-MM-dd')
$Subject = 'RC_Backup'
$LogFileName = -join ($Subject, '_-_', $TimeStamp, '.log')
$FullLogFileName = Join-Path -Path $env:TEMP -ChildPath $LogFileName
foreach ($CL_Item in $ComputerList)
{
$RemoteSourceDir = '\\{0}\{1}' -f $CL_Item, $SourceDir
if (Test-Path -LiteralPath $RemoteSourceDir)
{
$FullDestDir = Join-Path -Path $RootDestDir -ChildPath ('{0}_-_{1}' -f $CL_Item, $TimeStamp)
$Null = mkdir -Path $FullDestDir -ErrorAction 'SilentlyContinue'
$RC_Params = @(
$RemoteSourceDir
$FullDestDir
$FileSpec
# put your current options below
"/Log:$FullLogFileName"
'/NP'
'/E'
# comment out the next line to suppress on-screen output
'/TEE'
)
robocopy $RC_Params
}
else
{
Write-Warning (' [ {0} ] was not found on [ {1} ].' -f $RemoteSourceDir, $CL_Item)
}
} # end >>> foreach ($CL_Item in $ComputerList)
如果源不可达则输出...
WARNING: [ \\LocalHost\d$\Temp\NotThere ] was not found on [ LocalHost ].
WARNING: [ \\127.0.0.1\d$\Temp\NotThere ] was not found on [ 127.0.0.1 ].
WARNING: [ \\MySysName\d$\Temp\NotThere ] was not found on [ ZK_01 ].
成功运行的截断输出......
Log File : C:\Temp\RC_Backup_-_2020-07-13.log
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Mon Jul 13 16:11:34 2020
Source : \\LocalHost\d$\Temp\
Dest : C:\Temp\Backups\LocalHost_-_2020-07-13\
Files : *.*
Options : *.* /TEE /S /E /COPY:DAT /NP /R:1000000 /W:30
------------------------------------------------------------------------------
1 \\LocalHost\d$\Temp\
New File 7.7 m testing.zip
New Dir 2 \\LocalHost\d$\Temp\1\
New File 422446 Lee_CHOICES_2017-07-07
New File 89854 Lee_CHOICES_2017-07-07.H3M
New Dir 23 \\LocalHost\d$\Temp\2\
New File 549 Archive_Backup_to_NAS_-_Update_One_Way_[daily] 2016-03-07 010000.log
New File 5119 Data_-_Update_One_Way_[daily] 2016-03-07 020000.log
New File 322186 Documents_-_Update_One_Way_[monthly] 2016-02-01 030000 [Error].log
New File 367981 Documents_-_Update_One_Way_[monthly] 2016-03-01 030000 [Error].log
New File 58906 Email_-_Update_One_Way_[monthly] 2016-02-01 040000 [Error].log
New File 59151 Email_-_Update_One_Way_[monthly] 2016-03-01 040004 [Error].log
New File 75434 Generic_Backup_to_NAS_-_Mirror_One_Way_[daily] 2016-03-07 050000 [Warning].log
[*...snip...*]
New File 326 desktop.ini
New File 25.0 m Wildlife.wmv
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 234 233 1 0 0 0
Files : 320 320 0 0 0 0
Bytes : 290.15 m 290.15 m 0 0 0 0
Times : 0:00:06 0:00:06 0:00:00 0:00:00
Speed : 49624024 Bytes/sec.
Speed : 2839.509 MegaBytes/min.
Ended : Mon Jul 13 16:11:40 2020
答案2
这就是我的简单的想法。
$ServerList = @( Server1 Server2 Server3 )
$AllBackups = "c:\allbackups"
$TimeStamp = (Get-Date).ToString('yyyyMMdd')
$SourceFolder = "C$\backupfiles"
foreach ($server in ServerList) {
Copy-Item -Path "\\$server\$SourceFolder" -Destination "$AllBackups\$server-$Timestamp" -Recurse
}