Dateinamen extrahieren – Powershell

Dateinamen extrahieren – Powershell

Ich habe Probleme, einige Daten aus einem Dateinamen zu extrahieren, da anscheinend ein Leerzeichen an das Ende des extrahierten Namens angehängt wird, selbst wenn ich versuche, es mit dem .trim()-Trick zu entfernen, funktioniert es nicht. Ich habe auch versucht, die Länge des Dateinamens -1 zu zählen, und das Leerzeichen bleibt stehen, aber stattdessen wird das letzte Zeichen entfernt. Dadurch wird es für mich sehr schwierig, einen Pfad zu einem erstellten Ordner zu leiten, da ich das Leerzeichen in den Pfad einfüge.

Dateinamen, aus denen ich versuche, Daten zu extrahieren

12 Monkeys S02E10 - Fatherland.txt
Colony S02E01 - Eleven Thirteen.txt
Prison Break S05E05 - Contingency.txt

Ich versuche, den Namen der Fernsehsendung zu extrahieren, einen Ordner in einem neuen Verzeichnis zu erstellen und die Datei dann in den erstellten Ordner zu verschieben.

Hier ist der Code, den ich verwende.

$TRANSFER = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TRANSFER\'
$TVSHOWS = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\'
$pattern = ‘\s+\S[0-9][0-9].*’

Get-ChildItem "$TRANSFER/*.txt" |
    ForEach-Object{

        $target = $_.BaseName -split $pattern

        Write-Host $target@123

      $jon = $TVSHOWS+$target


        If( -not (test-path $jon)) 
            {
            New-Item -ItemType Directory -force -Path $jon
            }

        Copy-Item -path $_.FullName -Destination $jon
        }

Und hier ist der Fehler

Quantico @123
Copy-Item : Could not find a part of the path 
'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\Quantico \Quantico S02E10 - 
JMPALM.txt'.
At line:20 char:9
+         Copy-Item -path $_.FullName -Destination $jon
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Copy-Item], DirectoryNotFoundExcept 
   ion
    + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerSh 
   ell.Commands.CopyItemCommand

Wie Sie sehen, habe ich für diese Abbildung die Variable (Name der Fernsehsendung) in einen „Satz“ eingefügt, damit Sie das hinzugefügte Leerzeichen sehen können. Ich habe versucht, \s+ hinzuzufügen, wodurch eines der Leerzeichen entfernt wird, aber ich kann das andere nicht loswerden, unabhängig davon, ob ich den Trimmtrick verwende oder nicht.

Kann jemand helfen, danke Connor Bracegirdle

Antwort1

Nur um zu zeigen, dass ein richtiger regulärer Ausdruck sehr gut in der Lage ist,
nicht nur den Namen, sondern alle im Dateinamen enthaltenen Elemente abzurufen,
indem er Erfassungsgruppen verwendet, die die Teile in Klammern einschließen

**EDIT: Siehe den RegEX live aufhttps://regex101.com/r/Vbhq7D/1**

## Q:\Test\2018\06\10\SU_1330038.ps1
$TRANSFER = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TRANSFER\'
$TVSHOWS  = 'C:\Users\BRACEGIRDLE\Favorites\Desktop\TV_SHOW\'

$Pattern = '(.*)\s+S(\d{2})E(\d{2})[\- ]+(.*)'
Get-ChildItem $TVSHOWS *.txt| Where-Object BaseName -match $Pattern |
    ForEach-Object{
        $jon = Join-Path $TVSHOWS $Matches[1]

        If( -not (Test-Path $jon)) {
            New-Item -ItemType Directory -Force -Path $jon |Out-Null
        }
        $_ | Copy-Item -Destination $jon

        [pscustomobject]@{
            Name   = $Matches[1]
            Series = $Matches[2]
            Episode= $Matches[3]
            Title  = $Matches[4]
        }
    }

Das Skript erstellt das Unterverzeichnis, führt die Kopie durch und zeigt außerdem diese Ausgabe:

Name         Series Episode Title
----         ------ ------- -----
12 Monkeys   02     10      Fatherland
Colony       02     01      Eleven Thirteen
Prison Break 05     05      Contingency    

Beispielbaum auf meinem Ramdrive a:

> tree A: /F
A:\
│   12 Monkeys S02E10 - Fatherland.txt
│   Colony S02E01 - Eleven Thirteen.txt
│   Prison Break S05E05 - Contingency.txt
├───12 Monkeys
│       12 Monkeys S02E10 - Fatherland.txt
├───Colony
│       Colony S02E01 - Eleven Thirteen.txt
└───Prison Break
        Prison Break S05E05 - Contingency.txt

Antwort2

Überprüfen Sie das Ergebnis von -split. Es erstellt ein Array mit 2 Mitgliedern

10JUN2018:012955 /:> $txts = Get-ChildItem "$TRANSFER/*.txt"
10JUN2018:012955 /:> ($txts[0].basename -split $pattern).GetType()

IsPublic IsSerial Name                                     BaseType                                                            
-------- -------- ----                                     --------                                                            
True     True     String[]                                 System.Array   
10JUN2018:012955 /:>"some random stuff" -split " stuff"
some random

10JUN2018:013239 /:>("some random stuff" -split " stuff")[0]
some random

Der geänderte Code mit Tweak:

$TRANSFER = "E:\Code\PS\myPS\2018\Jun\10"
$TVSHOWS = "E:\code\PS\myPS\2018\Jun\TV_SHOW\"
$pattern = ‘\s+\S[0-9][0-9].*’

Get-ChildItem "$TRANSFER/*.txt"| ForEach-Object {
    $target = ($_.BaseName -split $pattern)[0]
    Write-Host "$target@123"
    $jon = $TVSHOWS+$target
}

Ausgabe:

12 Monkeys@123
Colony@123
Prison Break@123

verwandte Informationen