Powershell - Как создать массив имен файлов на основе имени файла? - PullRequest
1 голос
/ 24 апреля 2020

Я ищу, чтобы создать массив файлов (в частности, PDF) на основе имен файлов в Powershell. Все файлы находятся в одном каталоге. Я потратил пару дней на поиски и не могу найти ничего, что имеет примеры этого или что-то близкое, но можно изменить. Вот мой пример имен файлов:

AR - HELLO.pdf
AF - HELLO.pdf
RT - HELLO.pdf
MH - HELLO.pdf
AR - WORLD. pdf
AF - WORLD.pdf
RT - WORLD.pdf
HT - WORLD.pdf
....

Я хочу объединить все файлы, заканчивающиеся на «ПРИВЕТ» в массив и «МИР» в другой массив и т. Д.

Я застрял довольно рано в процессе, поскольку я новичок в создании сценариев, но вот мое печальное начало:

Get-ChildItem *.pdf
 Where BaseName -match '(.*) - (\w+)'


Обновленная информация ... Я не знаю имени после "-", поэтому использование регулярных выражений работает.
Моя конечная цель - объединить PDF-файлы основанный на соответствующем тексте после "-" в имени файла и наиболее базовом c коде для этого:

$file1 = "1 - HELLO.pdf"
$file2 = "2 - HELLO.PDF"
$mergedfile = "HELLO.PDF"

Merge-PDF -InputFile $file1, $file2 -OututFile $mergedfile

Я также получил Merge-PDF для работы с использованием этого кода который объединяет все PDF-файлы в каталоге:

$Files = Get-ChildItem *.pdf
$mergedfiles = "merged.pdf"
Merge-PDF -InputFile $Files -OutputFile $mergedfiles

Используя этот код из @Mathias, часть суффикса $ в -OutputFile работает, но часть -InputFile возвращает ошибку «За исключением Ион вызывает "Close" с аргументом (ами) "0" "

$groups = Get-ChildItem *.pdf |Group-Object {$_.BaseName -replace 
'^.*\b(\w+)$','$1'} -AsHashTable

foreach($suffix in $groups.Keys) {Merge-PDF -InputFile $(@($groups[$suffix])) 
-OutputFile "$suffix.pdf"}

Для -InputFile я пробовал много разных вариантов, и я продолжаю получать ошибку аргументов" 0 ". Значения в Hashtable кажутся правильными, поэтому я не уверен, почему это не работает.

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Это должно сработать:

$HELLO = Get-ChildItem *HELLO.pdf |Select -Expand Name
$WORLD = Get-ChildItem *WORLD.pdf |Select -Expand Name

Если вы хотите сгруппировать имена файлов по последнему слову в базовом имени, и вы не знаете их заранее, регулярное выражение действительно опция:

$groups = Get-ChildItem *.pdf |Group-Object {$_.BaseName -replace '^.*\b(\w+)$','$1'} -AsHashTable

И затем вы можете сделать:

$groups['HELLO'].Name

для всех имен файлов, заканчивающихся словом HELLO, или, чтобы перебрать все из них:

foreach($suffixGroup in $groups.GetEnumerator()){
  Write-Host "There are $($suffixGroup.Value.Count) files ending in $($suffixGroup.Key)"
}
0 голосов
/ 25 апреля 2020

Другой вариант - получить все элементы с помощью Get-ChildItem и использовать Where-Object для фильтрации.

$fileNames = Get-ChildItem | Select-Object -ExpandProperty FullName 
#then filter
$fileNames | Where-Object {$_.EndsWith("HELLO.PDF")}

#or use the aliases if you want to do less typing:
$fileNames = gci | select -exp FullName
$fileNames | ? {$_.EndsWith("HELLO.PDF")}

Просто хотелось показать дополнительные параметры, особенно командлет Where-Object, который пригодится, когда вы Вы вызываете командлеты, у которых нет параметров для фильтрации.

Примечание:

Вы можете спросить, что делает -ExpandProperty.

Если вы просто вызовете gci | select -exp FullName, вы получите массив PSCustomObjects (каждый из которых имеет одно свойство с именем FullName).

Это может сбить с толку людей, которые на самом деле не видят, что объекты напечатаны, так как их не видно, просто взглянув на скрипт PowerShell.

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