使用Copy-Item执行文件验证检查

时间:2015-03-21 21:05:08

标签: powershell hash verification file-copying

以下脚本在servers.txt中的服务器上创建一个名为指定日期的文件夹,然后将运行脚本的文件夹复制到该文件夹​​。

例如,它会创建文件夹" 3-22-15(night)"在SERVER1,SERVER2等上,然后复制"包含脚本的目录"到" 3-22-15(夜晚)"。

$CurrentLocation = get-location
$DeploymentDate = "3-22-15 (night)"

Foreach($server in get-content "servers.txt"){
    New-Item -ErrorAction SilentlyContinue -ItemType directory -Path \\$server\C$\Deployments\$DeploymentDate

    copy-item -Path $CurrentLocation -Destination \\$server\C$\Deployments\$DeploymentDate\ -ErrorAction SilentlyContinue -recurse
}

如何修改脚本以包含复制到\\$server\C$\Deployments\$DeploymentDate\的每个文件的文件验证?

我希望它输出一条错误消息,其中包含未通过验证检查的文件,但是要继续复制。

我打算尝试这样的事情:

function SafeCopy ($SourcePath,$DestinationPath,$SourceFileName) {
    #MD5 Check Function
    function Check-MD5 ($FilePath) {
        $md5=New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
        $hash=[System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($FilePath)))
        Return $hash
    } # EndOf function Check-MD5

    $MD5Source=Check-MD5 $SourcePath
    Copy-Item $SourcePath\$SourceFileName $DestinationPath
    $MD5Destination=Check-MD5 $DestinationPath

    if (Test-Path $DestinationPath) {
        if ($MD5Destination -match $MD5Source) {
            Write-Host "`nThe file `"$SourcePath`" has been copied in `"$DestinationPath`" successfully.`n" -ForegroundColor DarkGreen
        } else {
            Write-Host "`nThe file `"$SourcePath`" has been copied in `"$DestinationPath`" but the CRC check failed!`n" -ForegroundColor DarkRed
        }
    } else {
        Write-Host "`nThe file `"$SourcePath`" has not been copied in `"$DestinationPath`"!`n" -ForegroundColor DarkRed
    }
}  # EndOf function SafeCopy

但我不确定如何实施它。

1 个答案:

答案 0 :(得分:0)

我不是一个有才华的脚本编写者,也不是我在收音机上播放一个,但我把它放在一起似乎有效。如上所述,比较的文件大小越大,它就越慢。

Param
 (
  [parameter(Mandatory=$true,Position=1,ValueFromPipeLine=$true)][string]$source,
  [parameter(Mandatory=$true,Position=2,ValueFromPipeLine=$true)][string]$dest
 )
$countsource = @(Get-ChildItem -Path $source -Directory)
$countdest = @(Get-ChildItem -Path $dest -Directory)
 IF($countsource = $countdest){
 "$source equals $dest"
 }
Else{
 "$source does not match $dest"
 }

示例使用和输出。 TODO:如果文件夹没有相同数量的项目(子文件夹和文件),则添加文件夹项目计数比较,警告或中断。

因此,复制文件夹,然后在复制完成后将Folder-Compare作为函数运行。

PS C:\Scripts> .\Folder-Compare.ps1 -source C:\Scripts\temp -dest C:\aaa
 C:\Scripts\temp does not match C:\aaa