sokratonis
Goto Top

Powershell suche u. vergleiche u. ändere bei Bedarf

Hallo,

ich brauche mal wieder Eure Hilfe und das hat beim letzten Mal so gut geklappt. Ich hoffe Ihr könnt mir auch dieses mal wieder helfen:

Ausgangssituation:
1. Es gibt den Ordner A und darin den order B. In Ordner A kommen automatisch Dateien.
2. Ein Script verändert dann die Dateibezeichnung und erstellt eine Kopie der Datei in Ordner B.
3. Danach wird die Datei aus Order A in Ordner C geschoben.

Nun soll folgendes passieren und hierfür brauche ich Eure hilfe:
2.1 Ein weiteres Script soll in der Datei nach einem bestimmten Wort suchen (z.B. "Seriennummer:"). Die dahinterstehende Nummer soll das Script dann mit allen Dateien aus dem Ordner B vergleichen. Gibt es bereits eine Datei, wo die Seriennummer vorhanden ist, dann soll das Script unterhalb von Seriennummer eine neue Zeile einfügen und einen vordefinierten (immer gleichen) Text hinzufügen (z.B. SN:Ja). Wenn die Seriennummer aber nicht in den Dateien aus Ordner B gefunden werden kann, dann soll er die Datei so lassen.

Hier ein Beispiel:
Ordner A:
Datei 10 (Seriennummer: 10)

Ordner B:
Datei 1 (Seriennummer: 1)
...
Datei 10 (Seriennummer: 10)
...
Datei 100 (Seriennummer: 100)
- - -

2.1 Script startet
Script durchsucht Ordner A, Datei 10 nach der Serienummer. Er findet die Nummer 10. Jetzt durchsucht er die Dateien aus Ordner B auf Seriennummer: 10. Er findet die Datei. In diesem Fall schreibt er in die Datei in Ordner A unterhalb von Seriennummer in eine neue Zeile SN: Ja. Fertig.


Findet dazu jemand eine Möglichkeit?

Content-ID: 538494

Url: https://administrator.de/forum/powershell-suche-u-vergleiche-u-aendere-bei-bedarf-538494.html

Ausgedruckt am: 23.12.2024 um 10:12 Uhr

TK1987
Lösung TK1987 23.01.2020 aktualisiert um 13:25:37 Uhr
Goto Top
Moin,

z.B. so:
$OrdnerA='C:\Ordner A'  
$OrdnerB='C:\Ordner B'  
$Suchbegriff='Seriennummer'  
$Einfügen='SN: Ja'  

$SN=sls "^$Suchbegriff" $OrdnerA\*  
$SN | % {
	$vorhanden=sls $_.Line $OrdnerB\*
	if ($vorhanden) {
		write-host $_.line gefunden in "'"$OrdnerB\$($Vorhanden.Filename)"'"  
		[array]$File=cat $OrdnerA\$($_.Filename) | select -First $_.LineNumber
		$File+=$Einfügen
		$File+=cat $OrdnerA\$($_.Filename) | select -skip $_.LineNumber
		$File | Out-File $OrdnerA\$($_.Filename)
	}
}

Gruß TK1987
sokraTonis
sokraTonis 27.01.2020 um 12:00:01 Uhr
Goto Top
Hallo TK1987,

"sls" in Zeile 6 will Powershell nicht (Fehler: kein bekanntes cmdlet...). Ich habe es also durch select-string ersetzt und erhalte dann folgende Meldung:
Die Datei *Pfad* kann nicht gelesen werden. Zugriff auf den Ordner wurde verweigert.

Irgendwas stimmt noch nicht so recht.
TK1987
TK1987 27.01.2020 aktualisiert um 13:09:58 Uhr
Goto Top
Zitat von @sokraTonis:
Hallo TK1987,
"sls" in Zeile 6 will Powershell nicht (Fehler: kein bekanntes cmdlet...).
sls ist in Powershell 5.1 ein vordefinierter Alias für select-string. Vermutlich nutzt du noch die ältere Version 2.0, siehe
$PSVersionTable
Bitte zukünftig immer dabei schreiben, wenn eine ältere Version genutzt wird.
Die Datei *Pfad* kann nicht gelesen werden. Zugriff auf den Ordner wurde verweigert.
Der ausführende Benutzer muss natürlich Lese- und Schreibrechte für Ordner A, sowie Leserechte für Ordner B bestizen. Andernfalls musst du das Skript als Administrator ausführen. Bei mir funktioniert es wunderbar (auch mit 2.0, nachdem sls duch select-string ersetzt wurde).

Gruß TK1987
sokraTonis
sokraTonis 29.01.2020 um 08:43:03 Uhr
Goto Top
Hi,

sls funktioniert nun also doch. Folgender Sachverhalt:

Ordner A = H:\OrdnerA
OrdnerB = H:\OrdnerA\OrdnerB

In dieser Konstellation wirft er den Zugriffsfehler aus. Ändere ich aber OrdnerB = H:\OrdnerB, dann wird das Script ausgeführt. Allerdings, obwohl gleiche Daten vorhanden sind, fügt er der Datei nicht die zusätzliche Zeile hinzu.
TK1987
TK1987 29.01.2020 aktualisiert um 13:14:16 Uhr
Goto Top
Stimmt, in dem Fall muss die Zeile

$SN=sls "^$Suchbegriff" $OrdnerA\*  
auf
$SN=sls "^$Suchbegriff" $OrdnerA\*.*  
abgeändert werden, sonst wird versucht eine Zeichenkette in einem Ordner zu suchen.

Noch besser wäre natürlich, das explizite Dateiformat anzugeben, also z.B. "*.txt", um Konflikten mit anderen Dateiformaten vorzubeugen.

Gruß TK1987
sokraTonis
sokraTonis 04.02.2020, aktualisiert am 05.02.2020 um 15:06:07 Uhr
Goto Top
Gut. Das Script läuft ohne Fehler durch. Es verändert aber die tatsächliche Datei nicht.

Frage 1:
Der Inhalt meines Suchbegriffs setzt sich zusammen aus:
Wort: Seriennummer
+
zufällige Nummer
Zeile: Seriennummer+12345

Die Nummer ändert sich jedes Mal. Muss das irgendwo berücksichtigt werden oder gebe ich als Suchbegriff trotzdem nur "Seriennummer" an?

Frage 2:
Wieso verändert er das Script nicht, obwohl alles fehlerfrei durchläuft?


---
Ich habe nun festgestellt:
Das Script funktioniert, wenn ich im Suchbegriff den tatsächlichen Wert aus der Datei angebe (Seriennummer:100).

Ich brauche aber im Suchebgriff variable Werte, da der Suchbegriff Seriennnummer nur ein Beispiel ist. Tatsächlich handelt es sich um "Text+Zahlen+Zahlen". Gibts hierfür eine Lösung?


---
Problem anderweitig gelöst. DANKE trotzdem TK1987.