具有目录列表的Powershell中的Robocopy

时间:2018-12-20 10:06:28

标签: powershell robocopy

我正在编写自己的备份脚本,以从计算机中备份部分(但不是全部)目录。目前,目录列表已在我的(powershell)脚本文件中进行了编程,但是最好的方法是使用外部文件列表。

这是我到目前为止所拥有的。

Clear-Host
$host.ui.RawUI.WindowTitle = "Backup script"
# get drive name
$driveName="smrbackup"
if ($backupDrive=(Get-PSDrive | Where-Object {$_.Description -eq     $driveName}).root) {
    write-host "found drive"
}
else {
    write-error "no backup drive"
    exit 1
}

$destFolder="robackup"
$dest=Join-Path -Path $backupDrive -ChildPath $destFolder
Write-host "backup destination is $dest"

# robocopy parameters
# /MIR Spiegelt eine Verzeichnisstruktur und löscht Dateien, die in der Quelle gelöscht wurden
# /V verbose output
# /DCOPY:T kopiert Verzeichnistimestamp
$parameters = @("/MIR", "/NP", "/R:3", "/W:2", "/FFT", "/MT:16")



$shutdown= Read-Host "`r`nshutdown after backup? (j/n/q = quit)"
if ($shutdown -eq "j") {
    "Der Computer wird nach dem Backup heruntergefahren!"
}
elseif ($shutdown -eq "q"){
    exit 0
}

cd c:\
# Liste aller zu kopierenden Verzeichnisse
"users\Stefan M\Documents",
"users\Stefan M\Desktop",
"users\Stefan M\Downloads",
"users\Stefan M\Music",
"users\Stefan M\VirtualBox VMs",
"MESS" | % { robocopy $_ ($dest + "/" + $_) $parameters }

一些问题:

  1. 我在互联网上找到了最后一行(管道和命令),它似乎可以正常工作。有人可以向我解释这里发生了什么吗?
  2. 使用rsync,我可以一次实现rsync的所有目录,并且在备份后,我获得了摘要,其中已复制了多少文件以及是否发生错误。在上面的行中,每个目录都启动了Robocopy,因此几乎看不到以前的文件夹是否已复制或是否发生错误。我如何才能在最后获得所有文件夹的摘要?

对于2,我可以使用for循环构建某些内容,但是如何查看总复制结果?有没有比收集退出代码更优雅的方法?

干杯,斯蒂芬

编辑:我发现这一行使用文件列表。所以剩下的问题是在所有robocopy运行之后如何获得总摘要?

cd c:\
gc "c:\Users\Stefan Mayrhofer\Documents\script\backup-src.txt" | % { robocopy $_ ($dest + "/" + $_) $parameters }

1 个答案:

答案 0 :(得分:1)

您的最后一行创建一个数组并执行robocopy foreach行(%foreach的别名)。 $_是当前正在处理的商品的占位符。

要使用存储数据的文件获得相同的结果,请创建一个.txt文件(如果需要,也可以创建.csv),每行一个路径。现在,使用get-content以数组的形式获取该文件的内容,并将其存储在变量中或直接在管道中使用:

Get-Content -Path $YourFilePath | foreach { robocopy $_ ($dest + "/" + $_) $parameters }

如果要收集robocopy的结果,只需将它们存储在变量中:

$Output = Get-Content -Path $YourFilePath | foreach { robocopy $_ ($dest + "/" + $_) $parameters }