brause1701
Goto Top

PowerShell, batch - bestimmte Dateien mittels Liste und Schleife kopieren

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:

$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!

Content-Key: 298204

Url: https://administrator.de/contentid/298204

Printed on: April 23, 2024 at 07:04 o'clock

Mitglied: 114757
Solution 114757 Mar 04, 2016, updated at Mar 05, 2016 at 13:26:19 (UTC)
Goto Top
Moin.
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...
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
Dann geht das hiermit
gc 'C:\textdatei.txt' | %{copy-item -Path "$_\*.txt"  -Destination 'C:\neu'}  
Gruß jodel32
Member: brause1701
brause1701 Mar 05, 2016 at 13:34:31 (UTC)
Goto Top
Hallo!

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
Mitglied: 114757
114757 Mar 06, 2016 updated at 17:00:18 (UTC)
Goto Top
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
# 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'  
}
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.
Member: brause1701
brause1701 Mar 09, 2016 at 19:26:58 (UTC)
Goto Top
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
Mitglied: 114757
114757 Mar 09, 2016 updated at 19:43:30 (UTC)
Goto Top
Zeile 8 einfach austauschen...
$content = gc $_.Fullname
(@(($content[0..1] -replace '10;11','1;2')) + ($content | select -skip 2)) | out-file $_.Fullname  
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