Как отфильтровать файл по имени файла с другим расширением файла с помощью PowerShell? - PullRequest
1 голос
/ 30 марта 2020

У меня есть файл с другим расширением. Как эти файлы

file123_A1.que
file456_B2.que
file123_00_A1.pro
file890_11_C2.pro

Я хочу скопировать файл в lastwritetime. Но я не хочу копировать файл, если у файла уже есть .pro, даже этот файл - последний раз. Например, после сортировки файла по lastwritetime файл, который будет скопирован, будет file123_A1.que, но имя этого файла уже имеет .pro, идентифицируя 2 последнее имя файла A1. Так что в этом случае мне нужно скопировать другой файл. Я не буду копировать файл, если у файла 2 одинаковые фамилии с разными расширениями (например, file123_A1.que и file123_00_A1.pro с одинаковыми 2 последними именами файлов. Я не буду копировать этот файл file123_A1.que)

Кто-нибудь может дать идею, пожалуйста. Спасибо, я попробовал это

$Sel_JobFolder = "D:\601"
$JobFolder = @(Get-ChildItem "$Sel_JobFolder\*.que" | Sort-Object LastWriteTime)[0] | 
ForEach-Object { Copy-Item -path $_.FullName -destination .\ -force}

1 Ответ

1 голос
/ 30 марта 2020

Один из подходов, который вы можете использовать:

  • Получить все файлы с Get-ChildItem и отсортировать по расширению в порядке убывания. Таким образом, это означает, что .que будет предшествовать .pro файлам. Мы можем использовать Sort-Object здесь, чтобы отсортировать вычисляемое свойство, которое извлекает расширение с помощью System.IO.Path.GetExtension(), также гарантируя, что мы установим Descending = $true для сортировки в порядке убывания.
  • Добавление файлов в таблицу ha sh, где ключ - это последний элемент от разбиения имени файла на "_", например, ключ станет A1 из file123_A1. Идея здесь заменить файлы .que файлами .pro, если они найдены.
  • Выполните итерацию таблицы ha sh и скопируйте последний файл. Если файл .pro был найден, он будет скопирован вместо файла .que. Если файл .pro не найден, мы копируем файл .que.

Демонстрация:

$directory = "D:\601"

# sort files by extension in descending order
$files = Get-ChildItem -Path $directory | Sort-Object -Property @{Expression = {[System.IO.Path]::GetExtension($_)}; Descending = $true}

# add files to hashtable. .que will be updated by .pro if found
$ht = @{}
foreach ($file in $files)
{
    $key = $file.BaseName.Split("_")[-1]
    $ht[$key] = $file.FullName
}

# copy files here
foreach ($entry in $ht.GetEnumerator())
{
    Copy-Item -Path $entry.Value -Destination .\
}

, которая скопирует следующие файлы в ваш текущий рабочий каталог .\:

D:\file456_B2.que
D:\file890_11_C2.pro
D:\file123_00_A1.pro

Здесь мы видим, что file123_A1.que был исключен из копирования, потому что file123_00_A1.pro заменил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...