
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