Windows-Eingabeaufforderung: Wie erhalte ich die Anzahl aller Dateien im aktuellen Verzeichnis?

24

Mit welchem ​​Befehl können Sie cmd.exedie Anzahl der Dateien im aktuellen Verzeichnis ermitteln?

Gibt es hier eine Powershell-Option?

Update : Ich hatte gehofft, zu vermeiden dir, da ich weiß, dass sich im aktuellen Verzeichnis mehr als 10.000 Dateien befinden. Wollte die Ausgabe der Aufzählung in das cmd-Fenster vermeiden. Vielen Dank!

p.campbell
quelle

Antworten:

27

Wenn Sie es mit machen wollen cmd, dann ist das folgende die triviale Art, es zu machen:

set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%

Das setzt die Kommandozeile voraus. In einer Batch-Datei würden Sie tun

@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal

was die Dinge ein wenig schöner macht. Sie können das >nulin einem Stapel löschen, da set /adas Ergebnis nicht angezeigt wird, wenn es über eine Stapeldatei ausgeführt wird - dies erfolgt direkt über die Befehlszeile. Außerdem muss das %Vorzeichen in der forSchleife verdoppelt werden.

Ich habe einige Fälle gesehen, in denen Leute geschickt Tricks ausprobieren find /c. Seien Sie sehr vorsichtig mit denen, da verschiedene Dinge dies brechen können.

Häufige Fehler:

  1. Verwenden Sie find /c /vund versuchen Sie, etwas zu finden, das niemals in einem Dateinamen enthalten ist, z ::. Gewohnheit. Arbeit. Zuverlässig. Wenn das Konsolenfenster auf Raster-Schriftarten eingestellt ist, können Sie diese Zeichenkombination abrufen. Ich kann Zeichen in einem Dateinamen wie umfassen :, ?usw. in ihren vollen Breite Varianten zum Beispiel, die dann in ihren normalen ASCII Pendants umgewandelt werden erhalten , die diese brechen. Wenn Sie eine genaue Zählung benötigen, versuchen Sie dies nicht.

  2. Verwenden Sie find /cund versuchen Sie, etwas zu finden, das immer in einem Dateinamen enthalten ist. Offensichtlich ist der Punkt ( .) eine schlechte Wahl. Eine andere Antwort schlägt vor

    dir /a-d | find /c ":"

    Dies setzt mehrere Dinge über das Gebietsschema des Benutzers voraus, von denen nicht alle garantiert wahr sind (ich habe einen Kommentar hinterlassen, in dem die Probleme aufgeführt sind) und gibt ein Ergebnis zu viel zurück.

Im Allgemeinen möchten Sie verwenden findauf dir /bweg denen schneidet alle Nicht-Dateinamen Material und vermeidet Fehler auf diese Weise fencepost.

Die elegante Variante wäre also:

dir /b /a-d | find /c /v ""

Dabei werden zuerst alle Dateinamen ausgegeben, jeweils eine Zeile. Und dann zählen Sie alle Zeilen dieser Ausgabe, die nicht leer sind. Da der Dateiname nicht leer sein darf (es sei denn, ich vermisse etwas, Unicode löst dies jedoch nach meinen Tests nicht aus).

Joey
quelle
1
+1 Genau das habe ich gesucht. Vielen Dank, JR!
Campbell
Kleine Änderung, um die 1. Version zu einer einzigen Zeile zu machen: (setze count = 0 & für% x in (*) do @ (setze / zähle + = 1> nul) && echo% count%
Jason Massey
+1 fürdir /b /a-d | find /c /v ""
Arvo Bowen
Diese Lösung funktioniert nicht gut, wenn Millionen von Dateien vorhanden sind. Es läuft "für immer" - eine bessere Lösung ist unten zu finden, die "in Sekunden" mit PS und [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan
@jason, das würde wahrscheinlich scheitern, da %count%es zur Analysezeit erweitert wird.
Joey
17

Fragen Sie und Sie erhalten: http://technet.microsoft.com/en-us/library/ee692796.aspx

Zählen der Anzahl der Elemente in einem Ordner

Nun, was weißt du? Es sieht so aus, als ob die Sonne endlich herauskommt. Das heißt, es ist fast Zeit für uns zu gehen. Bevor wir dies jedoch tun, zeigen wir Ihnen einen letzten kleinen Trick mit dem Cmdlet Get-ChildItem. Manchmal muss man nicht wirklich viel über die Dateien in einem Ordner wissen. Alles, was Sie wirklich wissen müssen, ist, wie viele Dateien (falls vorhanden) in einem bestimmten Ordner gefunden werden können. So können Sie schnell die Anzahl der Dateien in einem Ordner zählen:

(Get-ChildItem C:\Scripts).Count

Was machen wir hier? Wir verwenden einfach Get-ChildItem, um eine Sammlung aller Elemente im Ordner C: \ Scripts zurückzugeben. Da es sich um eine Auflistung handelt, müssen wir nur den Wert der Count-Eigenschaft zurückgeben, die die Anzahl der Elemente in der Auflistung angibt. Beachten Sie die Verwendung von Klammern: Wir setzen den Befehl Get-ChildItem in Klammern, um sicherzustellen, dass Windows PowerShell zuerst die Auflistung aufruft und erst dann den Wert der Count-Eigenschaft für diese Auflistung zurückgibt.

Und natürlich können Sie beim Aufrufen von Get-ChildItem einen Filter einfügen. Müssen Sie wissen, wie viele .PS1-Dateien sich im Ordner C: \ Scripts befinden? Alles klar:

(Get-ChildItem C:\Scripts -filter "*.ps1").Count

Zu Ihrer Information ... Ich habe "Powershell Count Files" gegoogelt.

Trevoke
quelle
1
Sie müssen eine Dateispezifikation hinzufügen, damit die Anzahl der Dateien tatsächlich gezählt wird, wie im zweiten Beispiel gezeigt
Jim B,
3
Nur um klar zu sein (Get-ChildItem C: \ Scripts) .Count gibt NICHT die Anzahl der Dateien in einem Ordner zurück, sondern die Anzahl der OBJEKTE in einem Ordner. Sie müssen einen Filter oder eine Dateispezifikation hinzufügen, um Dateien zählen zu können. Versuchen Sie (gci) .count und dir von der Wurzel Ihres C: Laufwerks und sehen Sie sich die Unterschiede in Zahlen an
Jim B
4
Wenn Sie über denselben Link auch Dateien in den Unterordnern zählen möchten, geben Sie (Get-ChildItem -recurse -filter "*.ps1").Count
Folgendes ein
1
Funktioniert nicht, wenn genau eine Datei vorhanden ist, muss etwa Folgendes ausgeführt werden: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. Nach dem, was ich an anderer Stelle gelesen habe, ist es kein Array, wenn es eine Datei gibt.
NealWalters
@ NealWalters: Dies war bis PowerShell v3 korrekt. Seitdem ist es egal.
Joey
8
dir /a-d | find "File(s)"

Ein Hinweis zur Verwendung von PowerShell für einfache Dateioperationen wie diese: Es ist im Vergleich zu cmd.exe unglaublich langsam, insbesondere über Netzwerkverbindungen oder wenn sich Tausende von Dateien im Verzeichnis befinden. Weitere Informationen finden Sie in diesem Forumsbeitrag .

rossnz
quelle
Wenn sich Ihr System in einer anderen Sprache als Englisch befindet, treten Probleme auf.
WalyKu
7

dir gibt Ihnen die Gesamtanzahl der Dateien am unteren Rand.

Lorenzog
quelle
1
1 Up mate, du hast mich geschlagen :)
dyasny
2
und um die Kosten zu vermeiden, die entstehen, wenn alle Zeilen im cmd-Fenster gescrollt werden.
gbjbaanb
1
oder nur dir > file.. ahh ich vermisse POSIX
Lorenzog
1
@lorenz: Aus irgendeinem Grund dir > filesollte das nicht unter Windows funktionieren? Die Ausgabeumleitung ist nicht gerade magisch, wissen Sie.
Joey
1
@johannes: es funktioniert tatsächlich! Ich vermisse POSIX, weil Sie "nur" tun können dir | grep (something), um das langsame Schreiben auf dem Bildschirm zu vermeiden, das die Dinge verlangsamt (und es insgesamt minimiert).
Lorenzog
7

Die schnellste Methode, die ich gefunden habe, besteht darin, Folgendes in der PS-Konsole auszuführen.

[System.IO.Directory]::GetFiles($path).Count

Dabei ist $ path ein lokaler Pfad oder eine UNC-Freigabe.

John Brooks
quelle
2
Sieh dir das an. Fast 7,5 Jahre nachdem die Frage gestellt wurde, erschien eine gültige fantastische Antwort!
p.campbell
Arbeitete auf einem virtuellen Server in einem Verzeichnis mit über 2,1 Millionen Dateien, um die Zählung in ca. 10 Sekunden für mich zurückzugeben. Dies sollte mit Sicherheit die richtige Antwort sein.
DarrenMB
Das ist wirklich die beste Antwort. Ich hatte einen Ordner mit 4,5 Millionen Dateien und diese Methode zählte sie in wenigen Sekunden. Methoden in anderen vorgeschlagenen Antworten liefen einige Minuten, bevor ich sie aufgab.
Ripvlan
3

Zählen Sie einfach die Zeilen aus der Ausgabe von dir / B (Verzeichnisse eingeschlossen):
dir /B | find /c /v "~~~"

Nur Dateien zählen (ohne Verzeichnisse):
dir /A-D /B | find /c /v "~~~"

Garcia
quelle
Dies gibt die Gesamtzahl der Dateien und Verzeichnisse zurück
TheCleaner
2

Fand dies im Netz:

dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%

Ich habe getestet und es scheint zu funktionieren.

Kelsey
quelle
"Scheint zu" ist hier das richtige Wort. (1) Dies ist in jedem Fall eine Ausnahme, da der dirBefehl eine Zeile mit einem Doppelpunkt enthält, bei der es sich nicht um eine Datei handelt. (2) Dies hängt vom Zeitformat ab, um einen Doppelpunkt einzuschließen, was nicht unbedingt der Fall sein muss. (3) Es basiert auf dem Zahlenformat ohne Doppelpunkt, was auch nicht unbedingt so sein muss. Außerdem ist das Durchsuchen einer Datei hier nicht erforderlich und funktioniert nicht, wenn Sie keinen Schreibzugriff haben - eine schlechte Idee.
Joey
Wie mache ich es, ohne die Datei "NUMfiles. ###" zu erstellen?
NickUnuchek
2

Nur eine Einschränkung für diejenigen, die möglicherweise die obige PowerShell-Antwort von Trevoke verwenden ( Windows-Eingabeaufforderung: Wie wird die Anzahl aller Dateien im aktuellen Verzeichnis ermittelt? ): Das Echo der Count-Eigenschaft einer von Get-ChildItem zurückgegebenen Auflistung kann beabsichtigt zu irreführenden Ergebnissen führen Wenn der Wert 1 oder 0 ist. Dies liegt daran, dass die Count-Eigenschaft nur für Arrays verfügbar ist. Wenn von Get-ChildItem weniger als 2 Elemente zurückgegeben werden, ist das Ergebnis skalar und .Count gibt nichts zurück. Um dies zu umgehen, müssen Sie es explizit in ein Array umwandeln, z. B. @ (Get-ChildItem C: \ Scripts) .Count.

Weitere Informationen finden Sie unter http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file oder http://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html .

Heather M.
quelle
0

dir Gibt die Anzahl der Dateien und Verzeichnisse unten zurück

dyasny
quelle
0

DIr wird natürlich arbeiten

Ohne etwas auf dem Server zu installieren, aber PowerShell auf Ihrer Workstation zu haben, können Sie Folgendes tun:

(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count

Dieser Befehl gibt Ihnen alle Dateien (System und versteckt enthalten) und wie bereits erwähnt, wenn Powershell auf dem Computer ist, können Sie einfach

(GCI c:\*.*).count

Beachten Sie, dass, wenn Sie das nicht einschließen . Sie erhalten eine Zählung aller Dateien und aller Verzeichnisse. Sie werden keine versteckten und Systemdateien einschließen, die Sie hinzufügen müssen - force, um sie alle zu zählen

Jim B
quelle
0

Wenn ich das nur einmal brauchte, würde ich nur dir verwenden, andernfalls würde ich erwägen, meine eigene zu rollen, wahrscheinlich als C # -App, weil ich damit am besten vertraut wäre (obwohl VBScript oder PowerShell auch brauchbar wären).

(Übrigens - es ist nicht DOS, wenn Sie cmd.exe verwenden)

Maximus Minimus
quelle
0

Ich glaube, Sie können attrib verwenden, um die Anzahl der Dateien zu erhalten:

attrib.exe /s /D *.*|find /c /v "" >> filecount.txt

Dadurch wird eine Datei mit dem Namen filecount.txt im aktuellen Verzeichnis mit der Anzahl der Dateien und Ordner im aktuellen Verzeichnis (einschließlich der neu erstellten Datei) erstellt. Sie können das ändern

*.*

zu

<full_path>\*.*

um die Anzahl der Dateien eines bestimmten Verzeichnisses zu erhalten. Entfernen Sie die Option "/ D", wenn Sie keine Ordner zählen möchten. Die Option "/ s" verarbeitet Dateien in allen Verzeichnissen im angegebenen Pfad. Entfernen Sie sie daher, wenn Sie nur Dateien im angegebenen Pfad und keine Dateien in Unterordnern speichern möchten.

Wenn Sie beispielsweise herausfinden möchten, wie viele Dateien sich in Ihrem Laufwerk C: \ und nicht in einem Unterordner befinden, verwenden Sie den folgenden Befehl:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt
rauchen
quelle
Die Verwendung von Dateien für Ergebnisse ist nicht die klügste Idee. Was machen Sie, wenn das aktuelle Verzeichnis von Ihnen nicht beschreibbar ist?
Joey
@Johannes Verwenden Sie ein Verzeichnis, auf das Sie Schreibzugriff haben? Leiten Sie die Ausgabe zB an C: \ MyWritableDir \ filecount.txt
smoak
Immer noch unnötig.
Joey
-2

Ich mache etwas Ähnliches und das funktioniert sofort mit einer beliebigen Anzahl von Dateien.

Setlocal enabledelayedexpansion

Dir /A | find "File(s)" >tmp

For /F "tokens=1" %%i in (tmp) do set n=%%i

Del tmp

If !n! GEQ 10 echo Too many files in directory.
Aaron Lowe
quelle
Warum eine unbrauchbare (und fehlerhafte) Antwort auf eine 6-jährige Frage mit bereits vielen (guten) Antworten posten?
Massimo
@ Massimo, weil ich mit den obigen Antworten nicht zufrieden war und eine elegantere Lösung wollte. Warum dem Streben nach zeitlich unbegrenztem Wissen im Wege stehen?
Aaron Lowe
Urgh! Die Antworten sehen schrecklich aus. Bearbeitete Lösung in Antwort. Keine Notwendigkeit, mich zu bedanken Ich liebe negative Vertreter für die Hilfe für andere :-P
Aaron Lowe
Es gibt wirklich keinen Grund, eine temporäre Datei zu verwenden, um eine Ausgabe zu speichern. Auch die Verwendung findist keine gute Idee. Einzelheiten finden Sie in der akzeptierten Antwort.
Massimo
@ Massimo Ich beantwortete Ihre Frage. Du schuldest mir eine Antwort. Wenn Sie mir zeigen können, wie ich die Verwendung der temporären Datei vermeiden kann, würde ich das begrüßen. Ich habe bereits alle Antworten gelesen, weshalb ich meine eigenen gepostet habe. Sie gehen davon aus, dass aufgrund der Annahme einer Antwort keine neuen Antworten gefunden werden können. Dies gilt nicht nur für das OP, sondern für alle, die nach der gleichen Lösung suchen.
Aaron Lowe