Копировать элемент по заголовку и метке времени - PullRequest
0 голосов
/ 16 мая 2019

Я использую приведенный ниже код для фильтрации файлов в зависимости от заголовков в файле.

Это работает как шарм, но у меня проблема с тем, что он принимает все файлы в $InputDirectory. Я хотел бы ограничить его, чтобы он занимал только файлы, которые 1-2 часа.

Есть два способа узнать дату этого процесса.

Имя файла содержит метку времени = XXXXXXXXXXX_XXXXXXXX_valuereport_YYYYMMDDhhmmss.csv

Метка времени создания файла (обратите внимание, что речь идет о 800К-1М файлах в каталоге, и каждый час добавляется еще больше, поэтому рекомендуется использовать самый быстрый способ.

Так как мне вставить что-то в мой код, чтобы он, кроме заголовка, принимал только файлы, которые <1-2 часа? * </p>

Извините за пример кода, я новичок в этом сайте и не уверен, как получить его в правильном порядке.

Пока ничего.

foreach ($FilePath in (Get-ChildItem $InputDirectory -File) | Select-Object -ExpandProperty FullName) {
    $Header = Get-Content $FilePath -First 1

    # test for a string in the header line that distincts it from the other files
    if ($Header -match ';energy,Wh,') {
        # the substring ';energy,Wh,' defines this file as a 'HeatMeter' file
        Copy-Item -Path $FilePath -Destination $OutputPathHeat
    } elseif ($Header -match ';fabrication-no,,inst-value,0,0,0;datetime,,inst-value,0,0,0;volume,m3') {
        # the substring ';datetime,,inst-value,0,0,0;volume,m3' defines this file as a 'WaterMeter' file
       Copy-Item -Path $FilePath -Destination $OutputPathWater
    } else {
        # if all key substrings above did not match, move to the 'Other' directory
        Copy-Item -Path $FilePath -Destination $OutputPathOther
    }

1 Ответ

0 голосов
/ 16 мая 2019

Существует несколько способов фильтрации списка каталогов. Самый простой способ - передать результат от Get-ChildItem до Where-Object, например:

Get-ChildItem -Path $InputDirectory -File | 
Where-Object { $_.CreationTime -gt (Get-Date).AddHours(-2) } | 
Select-Object -ExpandProperty FullName | 
ForEach-Object {
    $FilePath = $_
    $Header = Get-Content $FilePath -First 1

    # test for a string in the header line that distincts it from the other files
    if ($Header -match ';energy,Wh,') {
        # the substring ';energy,Wh,' defines this file as a 'HeatMeter' file
        Copy-Item -Path $FilePath -Destination $OutputPathHeat
    }
    elseif ($Header -match ';fabrication-no,,inst-value,0,0,0;datetime,,inst-value,0,0,0;volume,m3') {
        # the substring ';datetime,,inst-value,0,0,0;volume,m3' defines this file as a 'WaterMeter' file
        Copy-Item -Path $FilePath -Destination $OutputPathWater
    }
    else {
        # if all key substrings above did not match, move to the 'Other' directory
        Copy-Item -Path $FilePath -Destination $OutputPathOther
    }
}

Проверяет, что CreationTime больше, чем сейчас - 2 часа. Обратите внимание, что последняя измененная (LastWriteTime) временная метка может также подходить для вашего варианта использования.

...