Estoy buscando crear una matriz de archivos (pdf específicamente) basados en nombres de archivo en Powershell. Todos los archivos están en el mismo directorio. He pasado un par de días buscando y no puedo encontrar nada que tenga ejemplos de esto o algo que esté cerca pero que pueda cambiarse. Aquí está mi ejemplo de nombres de archivo:

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

Me gustaría combinar todos los archivos que terminan en 'HOLA' en una matriz y 'MUNDO' en otra matriz y así sucesivamente.

Estoy atrapado bastante temprano en el proceso ya que soy nuevo en la creación de scripts, pero aquí está mi triste comienzo:

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


Información actualizada ... No sé el nombre después de "-", así que usar regex está funcionando.
Mi objetivo final es combinar archivos PDF basados en el texto correspondiente después del "-" en el nombre del archivo y el código más básico para esto es:

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

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

También he conseguido que el Merge-PDF funcione con este código que combina todos los PDF en el directorio:

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

Al usar este código de @Mathias, la porción de sufijo $ del archivo -OutputFile funciona, pero la porción -InputFile devuelve un error "Excepción llamando a" Cerrar "con argumento (s)" 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"}

Para el archivo de entrada, he probado muchas variedades diferentes y sigo recibiendo el error de argumento "0". Los valores en Hashtable parecen ser correctos, así que no estoy seguro de por qué esto no funciona.

Gracias

1
Makawide 24 abr. 2020 a las 18:56

2 respuestas

Otra opción es obtener todos los elementos con Get-ChildItem y usar Where-Object para filtrar.

$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")}

Solo quería mostrar más opciones, especialmente el cmdlet Where-Object que resulta útil cuando se llaman cmdlets que no tienen parámetros para filtrar.

Nota al margen:

Tal vez se pregunte qué hace -ExpandProperty.

Si solo llama a gci | select -exp FullName, obtendrá una matriz de PSCustomObjects (cada uno de ellos con una propiedad llamada FullName).

Esto puede ser confuso para las personas que realmente no ven que los objetos están escritos, ya que no son visibles simplemente mirando el script de PowerShell.

0
Ambrose Leung 25 abr. 2020 a las 15:36

Esto debería hacer el truco:

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

Si desea agrupar los nombres de archivo por la última palabra en el nombre base y no los conoce por adelantado, regex es una opción:

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

Y luego puedes hacer:

$groups['HELLO'].Name

Para todos los nombres de archivo que terminan con la palabra HELLO o para iterar sobre todos ellos:

foreach($suffixGroup in $groups.GetEnumerator()){
  Write-Host "There are $($suffixGroup.Value.Count) files ending in $($suffixGroup.Key)"
}
2
Mathias R. Jessen 26 abr. 2020 a las 16:08