Benutzer mit den meisten Antworten
Count schlägt fehl für nur einen Eintrag?!?

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!
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
-
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
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
-
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
-
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
-
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 --
-
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' '