Verwenden Sie die Liste der partiellen Dateinamen in TXT, um Dateien von einem Ordner in einen anderen zu kopieren

508
Drew Branson

Ich habe eine große Anzahl von Bildern in einem einzigen Ordner gespeichert und sortiert, um zu wählen, welche Ordner in bestimmte Ordner kopiert werden sollen, z. B. "Landschaft" oder "Technisch", und eine Liste von Teildateinamen für jeden Ordner in einer Textdatei erstellt. z.B. Scenery.txt

4811 4819 4820 

Dies sind die eindeutigen Dateinummern, die Teil der vollständigen Dateinamen sind, zum Beispiel:

C:\Users\drewb\Pictures\2018_08_Inuvik\All\DSC_4811.jpg 

Ich habe ein Skript in Powershell, das für mich funktioniert hat, als ich eine Liste der vollständigen Dateinamen in einer TXT-Datei hatte, aber um Zeit zu sparen, weil ich mehr Fotos habe, habe ich nur die Bildnummer geschrieben. Ich hoffe, es gibt eine Möglichkeit, ein Array dieser Liste zu erstellen und als Variable unter dem vollständigen Dateinamen in einer Schleife einzugeben, aber jeder Vorschlag ist willkommen.

Der Code, der für mich mit den vollen Namen in der .txt funktionierte, war

Get-Content C:\Users\drewb\Pictures\2018_08_Inuvik\Technical.txt | ForEach-Object 

Gelöst: Ich habe es gelöst, indem ich den Dateipfad mit den Namen und der Dateierweiterung in Excel verkettete und dann das zuvor verwendete PS-Skript verwendete. Ich denke jedoch, dass es einen direkteren Weg geben muss, in dem das Skript erstellt werden könnte.

0
Befinden sich die Bildnummern in der Datei jeweils in einer neuen Zeile oder sind sie nebeneinander? SimonS vor 6 Jahren 0
Ich glaube, Sie brauchen ein intelligenteres Werkzeug als nur CMD oder Powershell. Andreas vor 6 Jahren 0
Die Bildnummern stehen in jeder neuen Zeile. Haben Sie Ideen, was ich gebrauchen könnte? Drew Branson vor 6 Jahren 0
@DrewBranson Ich verstehe die Frage nicht zu 100%. Welche Bilder müssen in welchem ​​Ordner liegen? Möchten Sie einen Ordner erstellen, z. B. "4811", und alle Dateien, in deren Dateiname "4811" eingetragen ist, sollten in diesen Ordner aufgenommen werden? Bitte erarbeiten Sie ein wenig, indem Sie Ihre Frage bearbeiten SimonS vor 6 Jahren 0
Ihre Frage braucht etwas mehr Klarheit. Anscheinend ist Powershell eine gute Lösung, die jedoch ohne eine andere Erklärung schwer zu beantworten ist. Sie können alle numerischen Werte aus Ihren Bildern extrahieren, wenn sie alle auf die gleiche Weise wie Ihr Beispielbild benannt werden, wie folgt: `gci | Wählen Sie -ExpandProperty BaseName | aus % {$ _. Split ('_') [1]} `. root vor 6 Jahren 0

1 Antwort auf die Frage

1
Youssef Abidi

Kurze Antwort

Wenn das aktuelle Verzeichnis Bilder enthält, deren Dateinamen demselben Muster folgen DSC_XXXX.jpg(wo XXXXeine Zahl ist) und eine Datei, Technical.txtdie einige dieser Nummern enthält, würde der folgende Befehl Technicalalle Dateien in den Ordner kopieren (sofern er im aktuellen Verzeichnis vorhanden ist) Eine Nummer steht in der Technical.txtDatei:

Get-Content Technical.txt | ForEach-Object { Copy-Item "DSC_$_.jpg" Technical } 

Wenn sich die Technical.txtDateien und die Bilddateien und das TechnicalVerzeichnis nicht im aktuellen Verzeichnis befinden, müssen vollständige oder relative Pfade angegeben werden, zum Beispiel:

Get-Content c:\path1\to\Technical.txt | ForEach-Object { Copy-Item "c:\path2\to\pictures\DSC_$_.jpg" c:\path3\to\Technical } 

Erläuterung

  • Der "DSC_$_.jpg"Ausdruck im Befehl wird verwendet, um den Namen der Bilddatei aus der Nummer zu generieren, die aus der Technical.txtDatei gelesen wurde, dh dem aktuellen Pipeline-Objekt (dh $_). Es wird einfach DSC_als Präfix und .jpgals Erweiterung hinzugefügt.
  • Get-Content liest den Inhalt der Technical.txtDatei.
  • ForEach-Object führt seine Skriptblockargumente (in geschweiften Klammern eingeschlossen {}) für jedes Objekt in der Pipeline aus. In diesem Fall wird jede Textzeile von zurückgegeben Get-Content.

Testen dieser Lösung (online oder lokal)

Am einfachsten ist es, diese Lösung online auszuprobieren .

Andernfalls kann das folgende Snippet verwendet werden, um im aktuellen Verzeichnis einen testOrdner mit einer Beispieldatei Technical.txtund gefälschten Bilddateien gemäß dem in dieser Antwort genannten Muster und einem leeren TechnicalVerzeichnis zu erstellen ( Vorsicht : Sie müssen .\testzu etwas anderem wechseln, wenn Sie dies bereits tun habe einen testOrdner im Arbeitsverzeichnis:

mkdir -ErrorAction SilentlyContinue .\test\Technical Out-File .\test\DSC_4811.jpg; Out-File .\test\DSC_4812.jpg; Out-File .\test\DSC_4813.jpg; Out-File .\test\DSC_4814.jpg; Out-File .\test\DSC_4819.jpg; Out-File .\test\DSC_4820.jpg; "4811`n4819`n4820" > .\test\Technical.txt 

(In der dritten Zeile steht `nein Zeilenendezeichen (der hintere Haken ( `) ist ein Escape-Zeichen in PowerShell).

Es generiert die folgenden Dateien:

.\test\DSC_4811.jpg .\test\DSC_4812.jpg .\test\DSC_4813.jpg .\test\DSC_4814.jpg .\test\DSC_4819.jpg .\test\DSC_4820.jpg .\test\Technical.txt 

Nachdem der als Antwort bereitgestellte Befehl ausgeführt wurde ( Get-Content .\test\Technical.txt | ForEach-Object { Copy-Item ".\test\DSC_$_.jpg" .\test\Technical }), lauten die Dateien:

.\test\DSC_4811.jpg .\test\DSC_4812.jpg .\test\DSC_4813.jpg .\test\DSC_4814.jpg .\test\DSC_4819.jpg .\test\DSC_4820.jpg .\test\Technical.txt .\test\Technical\DSC_4811.jpg .\test\Technical\DSC_4819.jpg .\test\Technical\DSC_4820.jpg 

Aufräumen:

ri -Recurse .\test