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-Key: 538494

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

Printed on: April 19, 2024 at 18:04 o'clock

Member: TK1987
Solution TK1987 Jan 23, 2020 updated at 12:25:37 (UTC)
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
Member: sokraTonis
sokraTonis Jan 27, 2020 at 11:00:01 (UTC)
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.
Member: TK1987
TK1987 Jan 27, 2020 updated at 12:09:58 (UTC)
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
Member: sokraTonis
sokraTonis Jan 29, 2020 at 07:43:03 (UTC)
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.
Member: TK1987
TK1987 Jan 29, 2020 updated at 12:14:16 (UTC)
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
Member: sokraTonis
sokraTonis Feb 04, 2020, updated at Feb 05, 2020 at 14:06:07 (UTC)
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.