none
Count schlägt fehl für nur einen Eintrag?!? RRS feed

  • Frage

  • Hallo!

    Sorry wenn diese Frage dümmlich ist, ich bin ein Powershell-Newbie.

    Ich möchte vor dem Ausführen eines Skripts überprüfen, ob Files mit einer bestimmten Extension existieren. Dazu verwende ich folgenden Code:

    $a = Get-ChildItem e:\Temp\Test\*.pas
    if ($a.Count)
    {
        "contains files"
    }
    else
    {
      do the work
    }

    Seltsamerweise funktioniert das $a.count wenn 2 oder mehr Einträge vorhanden sind, bei nur einem Eintrag schlägt das fehl.

    Ich hab nun folgendes probiert:

    (dir *.ps1).count   -> 3 files, liefert "3"

    (dir *.bat).count   -> 1 file, liefert nichts

    (dir *.xxx).count   -> 0 files, liefert auch nichts.

    Hilfe!

    Mittwoch, 7. März 2012 09:40

Antworten

  • Ich vermute folgendes:

    Wenn Get-ChildItem nur eine Datei findet dann bekommst du EIN Objekt vom Typ System.IO.FileInfo zurück.
    Dieses Objekt hat natürlich keine Eigenschaft .Count deshalb schlägt das fehl.

    Wenn Get-ChildItem mehrere Dateien findet dann bekommst du ein Array von System.IO.FileInfo Objekten zurück. (Also Objekte verpackt in einem Array). Das Array hat die Eigenschaft Count die du abfragen kannst.

    Mit Measure-Object kannst du Objekte zählen lassen und dies auswerten.

    $a = Get-ChildItem e:\Temp\Test\*.pas
    if ($($a | measure).count -gt 0 )
    {
        "contains files"
    }
    else
    {
      do the work
    }

    In PowerShell nimmt man für so etwas eigentlich die Pipeline

    Get-ChildItem e:\Temp\Test\*.pas | #tu was mit den dateien Hier


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '



    • Bearbeitet Peter Kriegel Mittwoch, 7. März 2012 10:23
    • Als Antwort markiert ralfiii Mittwoch, 7. März 2012 11:00
    Mittwoch, 7. März 2012 10:17
  • Hi,

    ist schon blöd. Da gibt es extra einen Zähler und der begint erst ab 2 zuzählen.

    Willst Du nur Abfragen ob mindestens eine Datei mit der Endung .pas existiert? Oder brauchst Du auch die Anzahl?

    Ich teste das bloße vorhanden sein einer Datei/ eines Pfades mit

    $a = Test-Path *.pas

    oder

    $b = Test-Path e:\test\*.pas

    Wenn eine Datei vorhanden ist, dann wird  TRUE zurückgegeben, ansonsten FALSE.

    /UPDATE

    Du kannst auch folgendes benutzen, wenn Du einen Zähler brauchst:

    if(Get-ChildItem *.pas){
     foreach ($a in (Get-ChildItem *.pas)){
       $i++
     }
     "Es sind " + $i + " Dateien vohanden"
    } else {
     "Es wurde keine Datei gefunden"
    }



    • Bearbeitet Dirk Heimann Mittwoch, 7. März 2012 10:45
    • Als Antwort markiert ralfiii Mittwoch, 7. März 2012 11:03
    Mittwoch, 7. März 2012 10:17

Alle Antworten

  • Hallo,

    sieh dir mal das Cmdlet "Measure-Object" an: http://technet.microsoft.com/de-de/library/dd315251.aspx

    $a = Get-ChildItem c:\Temp\Test\* -Include *.pas
    $($a | Measure-Object).count

    Mfg

    Schlieng

    • Als Antwort markiert ralfiii Mittwoch, 7. März 2012 11:01
    • Tag als Antwort aufgehoben ralfiii Mittwoch, 7. März 2012 11:03
    Mittwoch, 7. März 2012 10:01
  • Ich vermute folgendes:

    Wenn Get-ChildItem nur eine Datei findet dann bekommst du EIN Objekt vom Typ System.IO.FileInfo zurück.
    Dieses Objekt hat natürlich keine Eigenschaft .Count deshalb schlägt das fehl.

    Wenn Get-ChildItem mehrere Dateien findet dann bekommst du ein Array von System.IO.FileInfo Objekten zurück. (Also Objekte verpackt in einem Array). Das Array hat die Eigenschaft Count die du abfragen kannst.

    Mit Measure-Object kannst du Objekte zählen lassen und dies auswerten.

    $a = Get-ChildItem e:\Temp\Test\*.pas
    if ($($a | measure).count -gt 0 )
    {
        "contains files"
    }
    else
    {
      do the work
    }

    In PowerShell nimmt man für so etwas eigentlich die Pipeline

    Get-ChildItem e:\Temp\Test\*.pas | #tu was mit den dateien Hier


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '



    • Bearbeitet Peter Kriegel Mittwoch, 7. März 2012 10:23
    • Als Antwort markiert ralfiii Mittwoch, 7. März 2012 11:00
    Mittwoch, 7. März 2012 10:17
  • Hi,

    ist schon blöd. Da gibt es extra einen Zähler und der begint erst ab 2 zuzählen.

    Willst Du nur Abfragen ob mindestens eine Datei mit der Endung .pas existiert? Oder brauchst Du auch die Anzahl?

    Ich teste das bloße vorhanden sein einer Datei/ eines Pfades mit

    $a = Test-Path *.pas

    oder

    $b = Test-Path e:\test\*.pas

    Wenn eine Datei vorhanden ist, dann wird  TRUE zurückgegeben, ansonsten FALSE.

    /UPDATE

    Du kannst auch folgendes benutzen, wenn Du einen Zähler brauchst:

    if(Get-ChildItem *.pas){
     foreach ($a in (Get-ChildItem *.pas)){
       $i++
     }
     "Es sind " + $i + " Dateien vohanden"
    } else {
     "Es wurde keine Datei gefunden"
    }



    • Bearbeitet Dirk Heimann Mittwoch, 7. März 2012 10:45
    • Als Antwort markiert ralfiii Mittwoch, 7. März 2012 11:03
    Mittwoch, 7. März 2012 10:17
  • Danke für die einleuchtende Erklärung...

    Zusammen mit Test-Path läuft nun alles so wie es soll...

    MfG

    Mittwoch, 7. März 2012 11:02
  • @Peter Kriegel,

    sorry hatte deinen Beitrag gar nicht richtig gelesen.

    Das Measure-Object kannte ich noch nicht, ist aber sehr interessant und nützlich! Habe ich sofort in einem Script getestet. :-)

    Danke

    Mittwoch, 7. März 2012 12:06
  • Hallo,

    das mit dem Zählen ist auch logisch. Wie Peter schon schrieb, bekommst Du in diesem Fall ein System.IO.FileInfo Objekt zurück. Wenn es jetzt mehrere Objekte sind, dann muss die Powershell die Objekte wiederum in ein Array verpacken. Eine ganz einfache Lösung für dieses Problem wäre, wenn man die Powershell zwingt immer als Ergebnis ein Array zu erstellen. Das könnte man so realisieren:

    $files = @(get-childitem C:\ *.txt)
    $files.count

    Jetzt geht auch bei nur einer oder keiner Datei die Count Methode da diese Methode zum Array gehört und nicht zu einem
    System.IO.FileInfo Objekt.

    Viele Grüße

    Frank


    -- Frank Röder blog.iteach-online.de --

    Mittwoch, 7. März 2012 20:42
  • Danke! Da bin ich nicht drauf gekommen!

    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 8. März 2012 08:31