Скрипт-блок, возвращающий объект для сравнения-объекта
Я пишу скрипт для сравнения 2-х мест самбы через объект сравнения.
Чтобы ускорить процесс, я бы хотел передать каждое место через поток в блок скриптов, где я позволил объекту быть созданным. После этого я хотел бы, чтобы выходные данные из блока скриптов как объект использовались в командлете Compare-Object.
Что у меня есть софар:
$nas_smb_share = "\\nas\loc\"
$cs_dest ="\\dest2\loc"
$check_hash = {
Param($loc)
$fso = (dir $loc -Recurse | Where-object{(!$_.psiscontainer) -AND ($_.LastWriteTime -gt (Get-Date).AddHours(-20))} | get-hash -Algorithm MD5)
return $fso
}
$compare_loc =@($nas_smb_share, $cs_dest)
foreach ($check in $compare_loc)
{
$running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
if ($running.Count -le 3)
{
$j = Start-Job -ScriptBlock $check_hash -ArgumentList $check -Name $check
} else
{
$running | Wait-Job
}
Get-Job | Receive-Job
$test = Receive-Job -Name $nas_smb_share -Keep
$test2 = Receive-Job -Name $cs_dest -Keep
}
Get-Job | Wait-Job | Receive-Job
так что все равно нужно добавить это где-то:
(Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU -Property hash -PassThru).Path | %{if ($_.SideIndicator -eq "=>" ){$result = ("$($_.InputObject)")}}
(dir $cs_dest -Recurse | Where-Object {(!$_.psiscontainer)} | get-hash -Algorithm MD5 | ? {$_.hashstring -match $result})
Но результат test и test2 являются хеш-таблицами (я думаю?), А не объектом.
Любой вклад будет оценен, где я ошибся, или как я могу сделать это по-другому
1 ответ
Решение
Если вы хотите вернуть имена файлов во втором местоположении, контрольные суммы которых не совпадают, вам помогут следующие выпуски.
$nas_smb_share = "\\nas\loc\"
$cs_dest = "\\dest2\loc"
$compare_loc = @($nas_smb_share, $cs_dest)
$check_hash = {
Param($loc)
return Get-ChildItem $loc -Recurse | Where-object {(!$_.psiscontainer) -AND ($_.LastWriteTime -gt (Get-Date).AddHours(-20))} | Get-FileHash -Algorithm MD5
}
$Jobs = @()
foreach ($check in $compare_loc) {
$Jobs += Start-Job -ScriptBlock $check_hash -ArgumentList $check -Name $check
}
$Jobs | Wait-Job | Out-Null
$test = Receive-Job -Name $nas_smb_share -Keep
$test2 = Receive-Job -Name $cs_dest -Keep
(Compare-Object -ReferenceObject $test -DifferenceObject $test2 -Property Hash -PassThru | Where-Object { $_.SideIndicator -eq "=>" }).Path