scriptblock возвращает объект для объекта сравнения

Я пишу скрипт для сравнения двух мест самбы через объект сравнения.

Чтобы ускорить процесс, я хотел бы передать каждое местоположение через поток в блок сценария, где я позволяю создавать объект. После этого я хотел бы, чтобы вывод из блока скриптов в виде объекта использовался в командлете 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 является хеш-таблицей (я думаю?), а не объектом.

Буду признателен за любой вклад в то, где я ошибся, или как я мог бы сделать это по-другому


person Michael    schedule 27.02.2018    source источник


Ответы (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
person t1meless    schedule 27.02.2018
comment
Спасибо за это! Любая причина, по которой нельзя передать объект? - person Michael; 28.02.2018
comment
Не могли бы вы уточнить вопрос? В предоставленном коде каждое задание возвращает массив PSCustomObject. Затем командлет Compare-Object выполняет сравнение между массивами. - person t1meless; 01.03.2018
comment
я привык к С#, где метод может повторно настроить объект. Затем вы можете сравнить эти объекты и их атрибуты друг с другом. Мне просто было интересно, возможно ли это с помощью powershell. Ваше решение работает как шарм, но заставило меня задуматься: p - person Michael; 01.03.2018
comment
Массивы $test и $test2 содержат рассматриваемые объекты. Вы можете перебирать их по своему собственному циклу. - person t1meless; 05.03.2018