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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: Doskias
Doskias 19.01.2021 aktualisiert um 10:15:23 Uhr
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.
Mitglied: Nxtrex
Nxtrex 19.01.2021 um 10:17:04 Uhr
Goto Top
Hallo,

er löscht garnichts.
Mitglied: 147323
147323 19.01.2021 aktualisiert um 10:32:54 Uhr
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
Mitglied: Doskias
Doskias 19.01.2021 aktualisiert um 10:38:21 Uhr
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 19.01.2021 aktualisiert um 10:48:24 Uhr
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.
Mitglied: Doskias
Lösung Doskias 19.01.2021 aktualisiert um 10:50:43 Uhr
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 19.01.2021 aktualisiert um 10:51:43 Uhr
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.
Mitglied: Doskias
Doskias 19.01.2021 um 10:52:15 Uhr
Goto Top
Ich bin jetzt von den drei Begriffen ausgegangen, die oben genannt wurden
Mitglied: Nxtrex
Nxtrex 19.01.2021 um 10:59:08 Uhr
Goto Top
Hallo,

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

Danke :D
Mitglied: Doskias
Doskias 19.01.2021 um 11:17:14 Uhr
Goto Top
Also bei mir kam keine Fehlermeldung mehr nach meinem Test. Egal was die Meldungen besagen. Die sollte man beheben face-smile