Какую команду вы бы использовали в cmd.exe
найти количество файлов в текущем каталоге?
Здесь есть опция PowerShell?
Обновить: Я надеялся избежать dir
, насколько мне известно, в текущем каталоге более 10 000 файлов. Хотел избежать вывода перечисления в окно cmd. Спасибо!
Если вы хотите сделать это с cmd
, то тривиальный способ сделать это:
set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%
Это при условии командной строки. В пакетном файле вы бы сделали
@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal
что делает вещи немного лучше. Вы можете отбросить >nul
в партии, так как set /a
не будет отображать результат при запуске из командного файла - он отображается непосредственно из командной строки. Кроме того, %
войдите в for
петлю нужно удвоить.
Я видел довольно много случаев, когда люди пробовали изящные трюки с find /c
. Быть очень осторожно с ними, так как разные вещи могут это сломать.
Распространенные ошибки:
С помощью find /c /v
и попробуйте найти то, что никогда не включается в имя файла, например ::
. Не будет. Работай. Надежно. Когда окно консоли настроено на растровые шрифты, вы жестяная банка получить эту комбинацию символов. Я могу включать символы в имя файла, например :
, ?
и т. д. в их полноразмерных вариантах, например, которые затем будут преобразованы в свои обычные аналоги ASCII, что нарушит это. Если вам нужен точный подсчет, не пытайтесь это сделать.
С помощью find /c
и попробуйте найти то, что всегда включены в имя файла. Очевидно точка (.
) - плохой выбор. Другой ответ предполагает
dir /a-d | find /c ":"
который предполагает несколько вещей о локали пользователя, не все из которых гарантированно верны (я оставил комментарий с подробным описанием проблем) и возвращает один результат слишком часто.
Как правило, вы хотите использовать find
на dir /b
который отсекает все вещи, не связанные с именами файлов, и таким образом избегает ошибок в столбах.
Итак, элегантный вариант:
dir /b /a-d | find /c /v ""
который сначала выведет все имена файлов, по одной строке каждое. А затем подсчитайте все строки этого вывода, которые не пусты. Поскольку имя файла не может быть пустым (если я чего-то не упускаю, но Unicode не отключит это согласно моим тестам).
Просите, и дано будет вам: http://technet.microsoft.com/en-us/library/ee692796.aspx
Подсчет количества элементов в папке
Что вы знаете: похоже, солнце наконец-то вышло, а значит, нам почти пора уходить. Однако прежде чем мы это сделаем, давайте покажем вам еще один маленький трюк с командлетом Get-ChildItem. Иногда вам не нужно много знать о файлах в папке; все, что вам действительно нужно знать, это сколько файлов (если есть) можно найти в определенной папке. Вот как можно быстро подсчитать количество файлов в папке:
(Get-ChildItem C:\Scripts).Count
Что мы здесь делаем? Мы просто используем Get-ChildItem, чтобы вернуть коллекцию всех элементов, найденных в папке C: \ Scripts; поскольку это коллекция, все, что нам нужно сделать, - это вернуть значение свойства Count, которое сообщает нам количество элементов в коллекции. Обратите внимание на использование круглых скобок: мы заключаем команду Get-ChildItem в круглые скобки, чтобы убедиться, что Windows PowerShell сначала захватит коллекцию, а только затем вернет значение свойства Count для этой коллекции.
И конечно, вы можете включить фильтр при вызове Get-ChildItem. Вам нужно знать, сколько файлов .PS1 находится в папке C: \ Scripts? Окей-док:
(Get-ChildItem C:\Scripts -filter "*.ps1").Count
FYI .. Я googledd "файлы подсчета PowerShell".
dir /a-d | find "File(s)"
Небольшое предупреждение об использовании PowerShell для таких простых файловых операций - он невероятно медленный по сравнению с cmd.exe, особенно при использовании сетевых подключений или когда в каталоге находятся тысячи файлов. Видеть это сообщение на форуме для получения дополнительной информации.
dir
внизу отображается общее количество файлов.
Самый быстрый способ, который я нашел, - запустить на консоли PS следующее.
[System.IO.Directory]::GetFiles($path).Count
где $ path - это локальный путь или общий ресурс UNC.
просто подсчитайте строки из вывода dir / B (включая каталоги):
dir /B | find /c /v "~~~"
только для подсчета файлов (без каталогов):
dir /A-D /B | find /c /v "~~~"
Нашел этот в сети:
dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%
Я тестировал, и вроде работает.
Просто предостережение для тех, кто может использовать ответ Trevoke PowerShell выше (Командная строка Windows: как узнать количество всех файлов в текущем каталоге?): по замыслу повторение свойства Count коллекции, возвращаемой Get-ChildItem, может дать вводящие в заблуждение результаты, если значение равно 1 или 0. Это связано с тем, что свойство Count доступно только для массивов. Если Get-ChildItem возвращает менее 2 элементов, результат является скалярным, а .Count ничего не возвращает. Чтобы обойти это, явно приведите его в массив, например, @ (Get-ChildItem C: \ Scripts) .Count.
Для получения дополнительной информации см. http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file или http://www.vistax64.com/powershell/266379-get-childitem-count-not-working-one-file.html.
dir
возвращает количество файлов и каталогов внизу
DIR конечно будет работать
Не устанавливая что-либо на сервере, но имея PowerShell на своей рабочей станции, вы можете:
(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count
эта команда предоставит вам все файлы (системные и скрытые), и, как упоминалось ранее, если на компьютере есть powershell, вы можете просто
(GCI c:\*.*).count
Обратите внимание: если вы не добавите . вы получите количество всех файлов и всех каталогов. Вы не будете включать скрытые и системные файлы, которые необходимо добавить - принудительно подсчитать их все
Если бы мне это нужно было только один раз, я бы просто использовал dir, в противном случае я бы подумал о том, чтобы развернуть свой собственный, вероятно, как приложение C #, потому что это то, с чем я был бы лучше всего знаком (хотя VBScript или PowerShell также были бы жизнеспособными).
(Кстати - это не DOS, если вы используете cmd.exe)
Я считаю, что вы можете использовать attrib для получения количества файлов:
attrib.exe /s /D *.*|find /c /v "" >> filecount.txt
Это создаст файл с именем filecount.txt в текущем каталоге с количеством файлов и папок в текущем каталоге (включая вновь созданный файл). Вы можете изменить
*.*
к
<full_path>\*.*
чтобы получить количество файлов в определенном каталоге. Удалите параметр «/ D», если вы не хотите подсчитывать папки. Параметр «/ s» обрабатывает файлы во всех каталогах по указанному пути. Поэтому удалите его, если вам нужны только файлы по указанному пути и вы не хотите включать файлы во вложенные папки.
Так, например, если вы хотите узнать, сколько файлов находится на вашем диске C: \, а не в какой-либо подпапке, вы должны использовать команду:
attrib.exe C:\*.* | find /c /v "" >> filecount.txt
Я делаю нечто подобное, и это мгновенно работает с любым количеством файлов.
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.