If you want to do it with cmd
, then the following is the trivial way to do it:
set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%
That's assuming the command line. In a batch file you would do
@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal
which does things a little nicer. You can drop the >nul
in a batch, since set /a
won't display the result if run from a batch file—it does directly from the command line. Furthermore the %
sign in the for
loop has to be doubled.
I've seen quite a few instances where people try nifty tricks with find /c
. Be very careful with those, as various things can break this.
Common mistakes:
Using find /c /v
and try finding something that is never included in a file name, such as ::
. Won't. Work. Reliably. When the console window is set to raster fonts then you can get those character combination. I can include characters in a file name such as :
, ?
, etc. in their full-width variants for example, which will then get converted to their normal ASCII counterparts which will break this. If you need an accurate count, then don't try this.
Using find /c
and try finding something that is always included in a file name. Obviously the dot (.
) is a poor choice. Another answer suggests
dir /a-d | find /c ":"
which assumes several things about the user's locale, not all of which are guaranteed to be true (I've left a comment detailing the problems there) and returns one result too much.
Generally, you want to use find
on dir /b
which cuts away all the non-filename stuff and avoids fencepost errors that way.
So the elegant variant would be:
dir /b /a-d | find /c /v ""
which will first output all file names, one line each. And then count all lines of that output which are not empty. Since the file name can't be empty (unless I'm missing something, but Unicode will not trip this up according to my tests).