nxtrex
Goto Top

If befehle richtig ausführen

Hallo,

ich habe ein Script gebaut, dass 3 Dateien auslesen soll und nach dem entsprechenden Inhalt nur diese 3 Dateien löschen soll.
Ich habe schon ein wenig gebastelt, jedoch funktioniert das ganze nicht wirklich.
Bitte um Unterstützung.

Hier das Script:

$Dateien=get-childitem c:\Location\test2
foreach($Datei in $Dateien){

$file = Get-Content c:\Location\test2\$Datei
$containsWord1 = $file1 | %{$_ -match "BMG-Lagerbestand"}
$containsWord2 = $file2 | %{$_ -match "BMG-Materialbelege"}
$containsWord3 = $file3 | %{$_ -match "BMG-Lieferungen"}

if ($containsWord1 -contains $true) {
{remove-item c:\Location\test2\$file1}

if ($containsWord2 -contains $true)
{remove-item c:\Location\test2\$file2}

if ($containsWord3 -contains $true)
{remove-item c:\Location\test2\$file3}

else {[System.Windows.Forms.MessageBox]::Show("Error","Error",0)}

}

}


Vorab vielen Dank.

MfG

Nick

Content-Key: 642039

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

Printed on: April 25, 2024 at 15:04 o'clock

Member: Doskias
Doskias Jan 19, 2021 updated at 09:15:23 (UTC)
Goto Top
Moin
Zitat von @Nxtrex:
ich habe ein Script gebaut, dass 3 Dateien auslesen soll und nach dem entsprechenden Inhalt nur diese 3 Dateien löschen soll.
Ich habe schon ein wenig gebastelt, jedoch funktioniert das ganze nicht wirklich.

Ich hab ein wenig überlegt aber irgendwie finde ich keinen Anhaltspunkt. Es wäre Hilfreich wenn du sagst was nicht funktioniert. Löscht er alles? löscht er gar nichts? Bekommst du eine Fehlermeldung? Malt er bunte Kreise?

Bitte um Unterstützung.

Bitte um mehr Informationen face-smile

Gruß
Doskias

PS: Code-Klammern sind nützlich, dann können wir die sagen in welcher Zeile dein Fehler sich versteckt, wenn man ihn gefunden hat.
Member: Nxtrex
Nxtrex Jan 19, 2021 at 09:17:04 (UTC)
Goto Top
Hallo,

er löscht garnichts.
Mitglied: 147323
147323 Jan 19, 2021 updated at 09:32:54 (UTC)
Goto Top
Da ist so ziemlich alles falsch was man falsch machen kann face-wink.
Dafür genügt ein Einzeiler ...
ls 'C:\Location\test2' -File | ?{sls $_.Fullname -Pattern ('BMG-Lagerbestand','BMG-Materialbelege','BMG-Lieferungen') -Simplematch -Quiet} | rm -force
Member: Doskias
Doskias Jan 19, 2021 updated at 09:38:21 (UTC)
Goto Top
Wenn man es nicht als Einzeiler möchte, würde ich es wie folgt lösen:
$Dateien=get-childitem c:\Location\test2
$werte = @("BMG-Lagerbestand","BMG-Materialbelege","BMG-Lieferungen")  

foreach ($wert in $werte)
{
foreach($Datei in $Dateien){

if ((get-content c:\Location\test2\$Datei) -contains $wert)
{Remove-Item c:\Location\test2\$Datei}
else
{echo "nein"}  
}
}

ggf. nochmal eine IF-Abfrage einbauen, damit die Schleife unterbrochen wird, wenn die Datei gelöscht wurde. Sonst gibt es Fehlermeldungen wenn der Inhalt verglichen wird nachdem die Datei gelöscht wurde.

Gruß
Doskias

@147323: Ich denke bei dem Ausgangsskript was der TO hier gepostet hat, wird er den Einzeiler nicht verstehen und daraus aus nichts lernen (können)
Mitglied: 147323
147323 Jan 19, 2021 updated at 09:48:24 (UTC)
Goto Top
if ((get-content c:\Location\test2\$Datei) -contains $wert)
Das funktioniert so aber nicht wenn die Zeilen noch anderen Text enthalten. Der Grund: -Contains prüft keine Teilstrings sondern nur ein bestehendes Array auf eine" exakte Übereinstimmung" eines Items.
wird er den Einzeiler nicht verstehen und daraus aus nichts lernen (können)
Braucht er nur nachschlagen. Handbücher lesen und Google bedienen ist natürlich Voraussetzung.
Member: Doskias
Solution Doskias Jan 19, 2021 updated at 09:50:43 (UTC)
Goto Top
Dann halt so:
$Dateien=get-childitem c:\Location\test2\
$werte = @("wert1","wert2","wert3")  
foreach($Datei in $Dateien)
{
  foreach ($wert in $werte)
    {
     if (test-path c:\Location\test2\$Datei)
      {
       if ((get-content c:\Location\test2\$Datei) -match $wert)
       {Remove-Item c:\Location\test2\$Datei}
       else
       {echo "nein"}  
      }
    }
}

Hab die Reihenfolge der Werte und Dateien nochmal getauscht, damit spielt es keine Rolle wie viele Dateien im Verzeichnis sind und die if-Abfrage eingebaut. Und wenn er contains nicht selbst durch match ersetzen kann, empfehle ich ein Buch face-smile
Mitglied: 147323
147323 Jan 19, 2021 updated at 09:51:43 (UTC)
Goto Top
-match $wert
Hier sollte man aber darauf hinweisen das -Match per Default mit regulären Ausdrücken arbeitet, wenn er also dort mit Sonderzeichen hantiert und nicht per [regex]::escape($wert) arbeitet und das nicht weiß geht das schnell in die Hose face-wink.
Member: Doskias
Doskias Jan 19, 2021 at 09:52:15 (UTC)
Goto Top
Ich bin jetzt von den drei Begriffen ausgegangen, die oben genannt wurden
Member: Nxtrex
Nxtrex Jan 19, 2021 at 09:59:08 (UTC)
Goto Top
Hallo,

er schmeißt mir zwar Unmengen an Fehlermeldungen raus aber es funktioniert.

Danke :D
Member: Doskias
Doskias Jan 19, 2021 at 10:17:14 (UTC)
Goto Top
Also bei mir kam keine Fehlermeldung mehr nach meinem Test. Egal was die Meldungen besagen. Die sollte man beheben face-smile