weezyt
Goto Top

Powershell - If Bedienung - Prüfe ob mehr als eine Datei vorhanden ist, dann mache weiter, sonst ignorier es

Hallo zusammen,

hab hier nen Skript zur gezielten Entfernung von Dateien im Unterverzechnis. In den Ordnern FPC1a und FPC1b ist jeweils eine oder mehrere Bilder gespeichert. Der Skript erlaubt z.b bei vielen Bildern in einer der Order, alles zu löschen, außer das Erste und das Letzte nach Datum. Nur ist das so , dass es manchmal vorkommt, dass nur ein Bild in den Ordnern ist und das führt eben zur ner Fehlermeldung.

Kann ich da einen weiteren If Bedienung einbauen, welches überprüft, ob mehr als 1 Bild drinne ist und bei true dann eben den Skript weiter durchläuft. Bei false diesen Ordner ignoriert?


Add-Type -AssemblyName System.Drawing

gci 'C:\Users\VAT1RT\Desktop\Versuch\*' -Recurse -Include "FPC1a","FPC1b" | ?{$_.PSIsContainer -and $_.FullName -notlike '*\PAL_XYR*' -and $_.FullName -notlike '*\After_Drift_Tilt*' -and $_.FullName -notlike '*\After_Drift_Z_Meas*'} | %{   


    $list = gci $_.Fullname  -Exclude *.txt | ?{!$_.PSIsContainer} | sort LastWriteTime 

    write-host $($_.FullName) -ForegroundColor Green

    if ($list){ 


        if ($list.length -gt 2){ 


            $list[1..($list.Length-2)] | remove-item -Force 


        } 


    } 


}



MfG

Content-ID: 300019

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

Ausgedruckt am: 20.11.2024 um 07:11 Uhr

114757
114757 24.03.2016 aktualisiert um 15:09:30 Uhr
Goto Top
Kann ich da einen weiteren If Bedienung einbauen, welches überprüft, ob mehr als 1 Bild drinne ist
Das wird in Zeile 13 schon gemacht...

Nur wenn es 3 oder mehr Bilder im Ordner gibt werden Dateien gelöscht, da zum Löschen ja mindestens 3 Bilder da sein müssen wenn du das älteste und das Neueste File erhalten willst.

Gruß jodel32
Weezyt
Weezyt 24.03.2016 um 15:37:52 Uhr
Goto Top
Eig schon ja es kommen auch keine Fehlermeldungen auf meinen Rechner, wenn ich es ausführe.
Über das Write-host sehe ich ja wie es die einzelnen Dateien auflistet und einfach ganz normal durchläuft. Aber auf der Anlage, wenn ich das Programm abspiele, kommen bei den Ordnern, wo eben nur ein Bild drinne ist, fehler. Ich kann mir diesen Mythos auch nicht erklären.

Der Fehler lautet so :

Unable to index an object of type Sytem.IO.Fileinfo.
At C:\Pfad\Skriptname.ps1 : 16 char:19
+                         $list[<<<<1..($list.lenght-2)) | remove-item -force
+ CategoryInfo               : InvalidOperation : (System.Object[]:Object) , Runntimeexpection
+ FullyQualifiedErrorId : Cannotindex  
114757
Lösung 114757 24.03.2016 aktualisiert um 15:47:20 Uhr
Goto Top
Powershell ist auf der Anlage aktuell ?

Nehm mal anstatt .length die Eigenschaft .count für den Vergleich in Zeile 13.
Biber
Biber 24.03.2016 um 15:51:39 Uhr
Goto Top
[OT]
Kann ich da einen weiteren If Bedienung einbauen
Nimm mal eine Bedingung statt einen Bedienung.

Bedienung ist deprecated seit PowerShell 2.0.
Biber

P.S. Es ist auch dir erlaubt, Titel und Eröffnungsbeitrag zu editieren.
[/OT]
Weezyt
Weezyt 24.03.2016 um 15:54:02 Uhr
Goto Top
hmm komisch mit count läuft das ding aufeinmal ohne Fehlermeldung .

Also ich habe auf beide die veraltete version. 1.0 drauf. Läuft eig der Prozess mit dem neueren Updates viel schneller?
Denn auf meinen Rechner läuft, dass eig relativ flüssig weisst du. Auf der Anlage hängt sich das auf und läuft halt wieder weiter, dauert eben länger.

Auf jeden Fall danke für die Hilfe face-smile

Gruß

PS: Warum nicht .lengt, sonder .count?
114757
114757 24.03.2016 aktualisiert um 16:24:28 Uhr
Goto Top
Zitat von @Weezyt:
PS: Warum nicht .lengt, sonder .count?
Count zählt die Objekte. Wenn in der Variablen aber nur ein Objekt vorhanden ist ist die Variable kein Array mehr und wenn man dann length verwendet gibt length stattdessen die Anzahl der Zeichen des Dateinames zurück, oder im Fall der PS 2.0 sogar gar auch nichts. Dies ist in aktuelleren Versionen nicht mehr der Fall.
Weezyt
Weezyt 30.03.2016 um 11:30:36 Uhr
Goto Top
Hallo nochmal,

weiß eigentlich einer, ob man den Befehl Write-Progress mit der If-Schleife kombinieren kann, sodass man zb bei einem längeren Prozess so ein Ladebalken visualisieren kann. Habe es nur nach einer for Schleife gesehen

$files = Get-ChildItem -Path C:\Users\VAT1RT\Desktop\Versuch -Recurse -Filter '*.bmp'  
 
For($i = 1; $i -le $files.count; $i++)
{  
 
    #$i =($i / $files.count*100)
    Write-Progress -Activity "Sammeln der Daten" -PercentComplete (($i*100)/$files.count) -Status "Gefundene Datei $($files[$i].Name)"  
    
    sleep -Milliseconds 100
}
$files | Select name

So kann ich ja einfach alle .bmp Dateien aufzählen bzw. auflisten aber wie kann ich das Ganze mit der If-Schleife kombinieren? Hat einer ne Idee

MfG
114757
114757 30.03.2016 aktualisiert um 11:43:48 Uhr
Goto Top
na, mit deine IF-Abfrage die FOR-Schleife umschließen...so dass der Fortschritt nur kommt wenn es Bilder gibt. Das 1 mal 1 der Programmierung.

Btw. eine "If-Schleife" gibt es in keiner Programmiersprache face-smile

Und please: Bestehende gelöste Beiträge nicht zum Stellen immer neuer Grundlagen-Fragen missbrauchen!
RTFM!
Weezyt
Weezyt 30.03.2016 um 11:46:55 Uhr
Goto Top
Oh stimmt If-Bedienung/Abfrage hieß es sry :D

Aber an welcher Stelle der If-Abfrage muss ich dass den einbauen in meinem Bespiel oben,?Das versteh ich nicht.
Biber
Biber 30.03.2016 aktualisiert um 11:53:20 Uhr
Goto Top
[OT ii]
Zitat von @Weezyt:

Oh stimmt If-Bedienung/Abfrage hieß es sry :D
Nein, es heisst nicht If-Bedienung... *schluchz*

Hätte ich ja bereits weiter oben erwähnen können, sorry, mein Fehler....

RTFDuden..

Ich hasse diese Montage....

Biber
[/OT ii]
114757
114757 30.03.2016 aktualisiert um 11:55:18 Uhr
Goto Top
Das versteh ich nicht
Oh mann echt schwer von Begriff... das Oberstübchen wohl noch beim Eier suchen face-confused
In Zeile 13 wird doch geprüft ob es mehr als 2 Bilder gibt oder nicht, also ist das deine Position an der du ansetzt, war das so schwer ?? Wenn ja dann Buch

Schon wieder Freidaach ?
Weezyt
Weezyt 30.03.2016 um 12:55:00 Uhr
Goto Top
Könnt ihr eig auch mal antworten ohne einen runterzumachen....

nach der If($list.length ...)also so :


Add-Type -AssemblyName System.Drawing 


gci 'C:\Users\VAT1RT\Desktop\Versuch\*' -Recurse -Include "FPC1a","FPC1b" | ?{$_.PSIsContainer -and $_.FullName -notlike '*\PAL_XYR*' -and $_.FullName -notlike '*\After_Drift_Tilt*' -and $_.FullName -notlike '*\After_Drift_Z_Meas*'} | %{    


    $list = gci $_.Fullname  -Exclude *.txt | ?{!$_.PSIsContainer} | sort LastWriteTime  


    write-host $($_.FullName) -ForegroundColor Green 


    if ($list){ 


        if ($list.length -gt 2){  For($i = 1; $i -le $list.count; $i++) {

        Write-Progress -Activity "Lade" -PercentComplete (($i*100)/$list.count)-Status "Gefundene Datei $($files[$i].Name)"  
        sleep -Seconds 1
        }

            $list[1..($list.Length-2)] | remove-item -Force  


        }  

    }  

}

tut aber nicht.
Biber
Biber 30.03.2016 um 13:18:09 Uhr
Goto Top
...und wenn du durchgängig $list.count statt willkürlich mal $list.count, mal $list.length nehmen würdest?
Weezyt
Weezyt 30.03.2016 um 13:45:20 Uhr
Goto Top
Ne leider nicht dewegen
114757
114757 30.03.2016 aktualisiert um 14:41:28 Uhr
Goto Top
Gähhnnn ...
gci 'C:\Users\VAT1RT\Desktop\Versuch\*' -Recurse -Include "FPC1a","FPC1b" | ?{$_.PSIsContainer -and $_.FullName -notlike '*\PAL_XYR*' -and $_.FullName -notlike '*\After_Drift_Tilt*' -and $_.FullName -notlike '*\After_Drift_Z_Meas*'} | %{  
    $list = gci $_.Fullname  -Exclude *.txt | ?{!$_.PSIsContainer} | sort LastWriteTime
    write-host $($_.FullName) -ForegroundColor Green
    if ($list){ 
        if ($list.Count -gt 2){ 
            1..($list.Count - 2) | %{
                Write-Progress -Activity "Löschvorgang" -PercentComplete (($_ / ($list.Count-2))*100) -Status "Lösche Datei $($list[$_].Fullname)"   
                $list[$_] | remove-item -Force
            }
            
        }
    }
}
@Biber mach hier den Laden dicht ... face-smile