Как обойти лимит обработки пакетных файлов - PullRequest
4 голосов
/ 11 марта 2010

У меня есть пакетный файл Windows, который обрабатывает все файлы в данном каталоге. У меня 206 783 файла, которые мне нужно обработать:

for %%f in (*.xml) do call :PROCESS %%f
goto :STOP

:PROCESS
:: do something with the file
program.exe %1 > %1.new
set /a COUNTER=%COUNTER%+1
goto :EOF

:STOP
@echo %COUNTER% files processed

Когда я запускаю командный файл, записывается следующий вывод:

65535 файлов обработано

В рамках обработки для каждого обработанного файла создается выходной файл с расширением .new. Когда я делаю dir *.new, он сообщает, что существует 65 535 файлов.

Итак, похоже, что моя командная среда имеет жесткое ограничение на количество распознаваемых файлов, и это ограничение составляет 64 КБ - 1.

  1. Есть ли способ расширить командную среду для управления более чем 64K - 1 файлами?
  2. Если нет, сможет ли VBScript или JavaScript обработать все 206 783 файла?

Я работаю на Windows 2003 server, Enterprise Edition, 32-bit.


UPDATE

Похоже, что основной причиной моей проблемы была встроенная в Windows команда извлечения ZIP-файлов.

Файлы, которые я должен обработать, были скопированы из другой системы через ZIP-файл. На моем сервере не установлена ​​утилита ZIP, только собственные команды Windows. Я щелкнул правой кнопкой мыши по ZIP-файлу и сделал «Извлечь все ...», которое, по-видимому, просто извлекло первые 65 535 файлов.

Я скачал и установил 7-zip на свой сервер, разархивировал все файлы, и мой пакетный скрипт работал как положено.

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Другим вариантом может быть итерация по выводу dir, а не по файлам. Я обычно ненавижу это, когда люди делают это, но, очевидно, имеют ограничения для стандартных итеративных идиом.

for /f "delims=" %%f in ('dir /b *.xml') do call :PROCESS %%f 

Я сейчас пробую это, но это может занять некоторое время; только что заполнил каталог 100k файлами.

Но имейте в виду, что при использовании выходных данных команды возникают проблемы с Юникодом, если вы используете растровые шрифты, поэтому убедитесь, что в окне консоли есть Lucida Console или другой набор шрифтов TrueType. В противном случае символы Unicode преобразуются в вопросительные знаки или их ближайший эквивалент в текущей кодовой странице, но программа не найдет файл.

ETA: Это не может быть проблемой, по-видимому. И ваш код, и мой тестовый код, который перебирает dir, обрабатывают файлы размером 300 КБ на Windows Server 2k3 R2, 32-разрядной и Windows 7.

0 голосов
/ 11 марта 2010

Два варианта:

1) Я предлагаю вам добавить «move» после обработки .exe, чтобы ваш пакетный файл можно было перезапустить и он обрабатывал только те файлы, которые все еще находятся в исходном каталоге. Это хорошая идея, независимо от предела фактического размера, поэтому вам не придется перерабатывать материал в случае прерывания партии или отключения питания и т. Д.

2) Используйте другой язык сценариев, например интерпретатор Perl для Windows, или, может быть, WSH .

0 голосов
/ 11 марта 2010
  1. если встроенный файл program.exe, вы можете рефакторинг принять аргументы так что вы можете покончить с петля
  2. вы можете сохранить свои выходные файлы в разные каталоги вместо создание в том же каталоге
  3. вы можете сгруппировать ваши выводы в категории, так что у вас меньше продукции файлы для работы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...