2

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

我有一个大致如下格式的所有约 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)、执行字符串替换并复制到该位置是否更容易?

谢谢!

4

1 回答 1

2

我可能在这里做出了过于宽泛的假设 - 但实际上加密文件和恢复文件之间的路径是相同的,只要您在两者之间进行适当的替换\\nas001\DATA\IQC\\nas001\IQC_restore正确?如果是这样....

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

$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 }

秘密解码环:

  • gcGet-Content cmdlet的别名
  • %ForEach-Object cmdlet的别名
  • $_是 foreach 脚本块中的一个特殊变量,它表示从管道传入的“当前项”——在这种情况下,输入文件 hname.txt 中的每一行
于 2013-11-11T22:04:49.193 回答