PowerShell, batch - bestimmte Dateien mittels Liste und Schleife kopieren
brause1701 (Level 1) - Jetzt verbinden
04.03.2016, aktualisiert 05.03.2016, 3764 Aufrufe, 5 Kommentare
Hallo Community,
ich habe eine Anfängerfrage: Ich benötige ein Script welches in einer Schleife bestimmte Dateien aus einem Verzeichnis in ein neues kopiert. Die Liste der Dateien beziehe ich aus einer Textdatei. Folgendes hab ich in der PowerShell versucht:
Das Problem ist, dass ich m.M.n. aus dem Array eine Liste erzeugen muss, damit er wirklich nur die einzelnen Zeilen der array.txt verwendet.
Danke für eure Hilfe!
ich habe eine Anfängerfrage: Ich benötige ein Script welches in einer Schleife bestimmte Dateien aus einem Verzeichnis in ein neues kopiert. Die Liste der Dateien beziehe ich aus einer Textdatei. Folgendes hab ich in der PowerShell versucht:
$array = @(import-csv .\array.txt)
foreach ($i in $array.arraylist)
{
copy .\alt\*$i*.txt .\neu\
}
Das Problem ist, dass ich m.M.n. aus dem Array eine Liste erzeugen muss, damit er wirklich nur die einzelnen Zeilen der array.txt verwendet.
Danke für eure Hilfe!
5 Antworten
- LÖSUNG 114757 schreibt am 04.03.2016 um 16:57:33 Uhr
- LÖSUNG brause1701 schreibt am 05.03.2016 um 14:34:31 Uhr
- LÖSUNG 114757 schreibt am 06.03.2016 um 17:50:45 Uhr
- LÖSUNG brause1701 schreibt am 09.03.2016 um 20:26:58 Uhr
- LÖSUNG 114757 schreibt am 09.03.2016 um 20:41:58 Uhr
- LÖSUNG brause1701 schreibt am 09.03.2016 um 20:26:58 Uhr
- LÖSUNG 114757 schreibt am 06.03.2016 um 17:50:45 Uhr
- LÖSUNG brause1701 schreibt am 05.03.2016 um 14:34:31 Uhr
LÖSUNG 04.03.2016, aktualisiert 05.03.2016
Moin.
Beispiel wenn in deiner Textdatei nur Pfade in dieser Weise untereinander stehen:
Dann geht das hiermit
Gruß jodel32
Zitat von @brause1701:
Die Liste der Dateien beziehe ich aus einer Textdatei. Folgendes hab ich in der PowerShell versucht:
Wie sieht diese genau aus ? Trennzeichen, Überschriften etc. pp...Die Liste der Dateien beziehe ich aus einer Textdatei. Folgendes hab ich in der PowerShell versucht:
Das Problem ist, dass ich m.M.n. aus dem Array eine Liste erzeugen muss, damit er wirklich nur die einzelnen Zeilen der array.txt verwendet.
Nein. Zeige uns den Aufbau deiner Text/CSV-Datei dann können wir dir 100% weiterhelfen. Danke.Beispiel wenn in deiner Textdatei nur Pfade in dieser Weise untereinander stehen:
C:\Pfad1
C:\Pfad2
C:\Pfad3
gc 'C:\textdatei.txt' | %{copy-item -Path "$_\*.txt" -Destination 'C:\neu'}
LÖSUNG 05.03.2016 um 14:34 Uhr
Hallo!
Erstmal Danke für die Tipps! Die Textdatei sieht so aus:
Die "num"-Spalte entspricht dem Dateinamen verschiedener Dateien (txt, jpg, pdf) innerhalb des Quellordners. Richtig cool wäre es noch in den Textdateien einige Zeichen in der ersten Zeile einfügen... ist aber nur Nice to Have!
Gruß,
brause1701
Erstmal Danke für die Tipps! Die Textdatei sieht so aus:
id;num
1;3015_2501
2;3015_2502
3;3016_2503
4;3016_2504
5;3016_2505
6;3017_2516
7;3017_2517
8;3017_2518
9;3017_2519
Die "num"-Spalte entspricht dem Dateinamen verschiedener Dateien (txt, jpg, pdf) innerhalb des Quellordners. Richtig cool wäre es noch in den Textdateien einige Zeichen in der ersten Zeile einfügen... ist aber nur Nice to Have!
Gruß,
brause1701
LÖSUNG 06.03.2016, aktualisiert um 18:00 Uhr
Das ist kein Problem. Es ist also eine ganz normale CSV-Datei. Diese können wir uns als Objekt importieren und dann via FOR-Schleife itterieren
Gruß jodel32
p.s. den neuen Post kannst du wieder löschen, damit wir das hier abfackeln können. Und den gelöst Status kannst du wieder selbst zurücksetzen.
Habe leider keine Benachrichtigung vom Forum bekommen deswegen die verspätete Antwort, da scheint was mit den Benachrichtigungen schief gelaufen zu sein.
# CSV Datei als Objekt importieren
$csv = Import-CSV 'C:\textdatei.csv' -Delimiter ";"
# Jede Zeile der CSV mit FOR-Schleife durchlaufen
$csv | %{
# Hinzufügen einer Zeile zu einer eventuell vorhandenen Textdatei
gci "C:\quellordner\$($_.num).txt" | %{
(@("Neue Zeile") + (gc $_.Fullname)) | out-file $_.Fullname
}
# Dateien mit dem entsprechendem Namen der aktuellen Zeile der CSV verschieben
copy-item -Path "C:\Quellordner\$($_.num)*" -Destination 'C:\neu'
}
p.s. den neuen Post kannst du wieder löschen, damit wir das hier abfackeln können. Und den gelöst Status kannst du wieder selbst zurücksetzen.
Habe leider keine Benachrichtigung vom Forum bekommen deswegen die verspätete Antwort, da scheint was mit den Benachrichtigungen schief gelaufen zu sein.
LÖSUNG 09.03.2016 um 20:26 Uhr
Hallo jodel32,
es funktioniert soweit... ich möchte aber keine neue Zeile einfügen sondern eine Zeile ändern, d.h. entweder die vollständige Zeile ersetzen oder noch besser an einer genauen Position Zeichen einfügen und an anderer Stelle Zeichen löschen.
Beispiel:
In allen gefundenen txt in Zeile 1 (oder auch Zeile 2) die Zeichen 10; 11 den Wert 1;2 einfügen und die Zeichen an Position 19;20 durch Leerzeichen ersetzen.
Vielen Dank!! Das Kopieren ist ohnehin wichtiger aber wenn du noch eine Idee hast wäre das Klasse!
Gruß,
brause1701
es funktioniert soweit... ich möchte aber keine neue Zeile einfügen sondern eine Zeile ändern, d.h. entweder die vollständige Zeile ersetzen oder noch besser an einer genauen Position Zeichen einfügen und an anderer Stelle Zeichen löschen.
Beispiel:
In allen gefundenen txt in Zeile 1 (oder auch Zeile 2) die Zeichen 10; 11 den Wert 1;2 einfügen und die Zeichen an Position 19;20 durch Leerzeichen ersetzen.
Vielen Dank!! Das Kopieren ist ohnehin wichtiger aber wenn du noch eine Idee hast wäre das Klasse!
Gruß,
brause1701
LÖSUNG 09.03.2016, aktualisiert um 20:43 Uhr
Zeile 8 einfach austauschen...
Statt -replace kannst du auch auf jedes einzelne Zeichen per Index [n] zugreifen und ersetzen, wie du lustig bist.
Achtung bei -replace wird mit Regular Expression Syntax gearbeitet
$content = gc $_.Fullname
(@(($content[0..1] -replace '10;11','1;2')) + ($content | select -skip 2)) | out-file $_.Fullname
Achtung bei -replace wird mit Regular Expression Syntax gearbeitet