在保留目录结构的同时复制文件

时间:2013-11-11 19:03:36

标签: powershell copy restore

我们的一个网站最近受到了CryptoLocker感染。幸运的是,我们很早就抓住了它,只有大约8k个文件在200k左右的文件系统中加密。我们的备份也很好,所以我可以恢复文件

我有大约以下格式的所有~8k加密文件的列表,每个新行一个文件:

\\nas001\DATA\IQC\file.xls
\\nas001\DATA\IQC\file2.xls
\\nas001\DATA\IQC\folder1\file1.xls
\\nas001\DATA\IQC\folder3\file1.xls

我做了一个好数据快照的ndmp副本,所以我正在恢复表单的备份是nas上的另一个卷,在某个点之后具有相同的文件夹结构:

\\nas001\IQC_restore\file.xls
\\nas001\IQC_restore\file2.xls
\\nas001\IQC_restore\folder1\file1.xls
\\nas001\IQC_restore\folder3\file1.xls

使用powershell(或者真的,使用批处理脚本或robocopy)是否有一种简单的方法解析带有加密文件列表的文件,并将这些文件从我们的备份复制到原始位置,覆盖加密文件?在另一个解决方案中,我找到了以下脚本:

$a = Get-Content "C:\script\hname.txt" 
foreach ($i in $a) 
    {$files= get-content "C:\script\src.txt"
    foreach ($file in $files)
    {Copy-Item $file -Destination \\$i\C$\temp -force}
    }

这几乎是我所需要的 - foreach $i in $a语句是多余的,因为我只有一个$ i,它将所有列出的文件复制到一个文件夹中,而不是以保存文件夹的方式复制它们结构。

最好的方法是什么?我可以将它传递给两个单独的文件并告诉它将两行链接为行,因此对于文件 a 中的每一行,它将文件复制到文件 b 中的路径吗?是否更容易传递一组文件(文件 a ),执行字符串替换并复制到该位置?

谢谢!

1 个答案:

答案 0 :(得分:2)

我可能在这里做了太广泛的假设 - 但只要你在\\nas001\DATA\IQC\\nas001\IQC_restore之间进行适当的替换,加密文件和恢复文件之间的路径是否完全一致?如果是这样......

您可以简单地从“已知的错误文件”文件(hname.txt?)中获取每个文件,并使用String.Replace方法替换目标的正确路径:

$files = Get-Content C:\script\hname.txt
foreach ($file in $files) {
    $src = $file.Replace("\\nas001\DATA\IQC","\\nas001\IQC_restore")
    Copy-Item $src -Destination $file -Force
}

或者,更简单:

$enc = '\\nas001\DATA\IQC'      # encrypted files share/folder
$good = '\\nas001\IQC_restore'  # clean share/folder
gc c:\scripts\hname.txt | % { copy $_.replace($enc,$good) -dest $_ -force }

秘密解码器响铃:

  • gc Get-Content cmdlet的别名
  • ForEach-Object cmdlet
  • 的别名
  • $ _ 是foreach scriptblock中的一个特殊变量,表示从管道传入的“当前项” - 在这种情况下,来自输入文件hname.txt的每一行