PowerShell: сравнение файлов в двух разных папках

У меня есть исходная папка и папка назначения. Если файл в исходной папке новее файла в папке назначения, его необходимо заменить. Я пробовал это сам, но это не работает так, как должно. Код, вероятно, решен слишком сложно для профессионалов.

$SourceAlarmgroups = $rootPath + "\..\..\..\..\..\..\Logical\VCShared\AlarmGroups"
$DestinationAlarmgroups = "$rootPath\Alarmgroups"

$lastModifiedDateSource = (Get-Item $SourceAlarmgroups).LastWriteTime
$lastModifiedDateDestination = (Get-Item $DestinationAlarmgroups).LastWriteTime

$FolderSource = Get-ChildItem -Recurse -Path $SourceAlarmgroups
$FolderDestination = Get-ChildItem -Recurse -Path $DestinationAlarmgroups

$FolderCheck = Compare-Object -ReferenceObject $FolderSource -DifferenceObject $FolderDestination

forEach($file in $FolderCheck){
    if ($file.sideindicator -eq "<="){
        $SetWriteCmd = 1
    }
}
if ($lastModifiedDateSource -gt $lastModifiedDateDestination -or $SetWriteCmd -eq 1 ){
    Write-Host " Collect alarm files..." 
    Get-ChildItem $SourceAlarmgroups -Include *.algrp | Copy-Item -Destination $DestinationAlarmGroups -Force -PassThru
    &$Script2RunAlarmexport
}else{ 
    Write-Host "Alarms: Already up to date"   
}

Возникают две проблемы:

  1. ссылка на пустую папку не работает, т.е. если папка назначения пуста, возникает ошибка.
  2. файлы не копируются из источника в место назначения

Кто-нибудь может мне помочь. ТИА!


person s0Nic    schedule 07.09.2020    source источник


Ответы (1)


для 1.:

Вам нужно проверить, не пуста ли ваша папка:

$DestinationFolder= Get-ChildItem "DestinationFolder" | Measure-Object


if (-not($DestinationFolder.count -eq 0)) 
{
    "execute your code"
    break;
}

Вы также можете использовать Test-Path, если вы знаете, какой путь или, по крайней мере, окончание файла вы ищете (пример того, что я использовал)

if ( Test-Path  "C:\Test") 
{
    Write-host "C:\Test already exists, either delete the directory or change to another directory in the code"
    break;
}

для 2.:

Даже в трубе Copy-Item нужен -Path, которого нет в вашем коде. У меня была аналогичная ситуация, которую я решил следующим образом:

Get-ChildItem -Path C:\Test -File  -Name | ForEach-Object {Copy-item -Path "C:\Test\$_"  -Destination  "C:\Test\$($_.substring(0,7))"}

Поэтому вам нужно указать, из какого пути вы копируете, однако вы все равно можете оставить файлы более гибкими.

person Adis1102    schedule 07.09.2020
comment
Спасибо за вашу поддержку. Не могли бы вы объяснить последнюю часть? ($_.substring(0,7)) - person s0Nic; 07.09.2020
comment
Добро пожаловать! Извините, что не разъяснил это: вы можете игнорировать последнюю часть после -Destination. Я просто хотел вставить полный код без пробелов, это не связано с вашим требованием. Однако, если вам просто интересно, что он делает: $_ означает каждый элемент, поступающий из конвейера, а подстрока (0,7) сокращает имя файла с 1-го символа до 7-го. Мне пришлось скопировать файл 123-123ABC.txt в папку 123-123, поэтому папка назначения была просто частью самого имени файла. - person Adis1102; 07.09.2020