2010-03-11 5 views
4

У меня есть пакетный файл 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, он сообщает 65535 файлов.

Таким образом, появляется моя команда среда имеет жесткое ограничение на количество файлов, которые он может распознать, и этот предел равен 64K - 1.

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

Я работаю на сервере Windows 2003, Enterprise Edition, 32-разрядный.


UPDATE

Похоже первопричиной моего вопроса был с командой встроенными в Windows «Extract» для ZIP файлов.

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

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

+0

Что делает 'program.exe'? Разработана ли она самостоятельно? или какой-либо сторонний инструмент, который вы загрузили? Может 'program.exe' принимать аргументы, например' program.exe * .xml' ?? Действительно ли ваш вывод должен быть 1 файл на 1 входной файл? – ghostdog74

+0

@ ghostdog74; program.exe разрабатывается самостоятельно, и, к сожалению, он может обрабатывать только один файл за один раз (я работаю в QA, поэтому я мало говорю о дизайне программы). И как программа в настоящее время разработана, она создаст 1 выходной файл для каждого входного файла. –

+0

Возможно, вам пора изучить PowerShell. Кажется, вы нажимаете предел со времен 16-разрядных вычислений, что не должно удивлять. –

ответ

3

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

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

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

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

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

+1

+1: У меня была такая же идея и протестировано ее для некоторых 300K файлов. Работает, как и ожидалось. –

+1

Вы получите еще лучшую производительность, если вы напишете вывод команды 'DIR' в файл и затем обработаете его содержимое. –

+0

@Frank и @Johannes; вы оба правы. Оказывается, основная причина - проблема со встроенной командой «извлечь» Windows для файлов ZIP. Файлы, которые я должен обрабатывать, находятся в ZIP-файле; мой сервер не имеет установленной утилиты ZIP, а только собственные команды Windows. По-видимому, «Извлечь все» извлекает только первые 65535 файлов. Я установил 7-zip, распаковал все файлы, и мой пакетный скрипт работал по назначению. –

0
  1. если program.exe является встроенной, вы можете реорганизовать его принимать в качестве аргументов так , что вы можете сделать прочь с для петли
  2. вы можете хранить выходные файлы в разные каталоги вместо от , создавая в том же каталоге
  3. Вы можете группировать свои выходы в категории , поэтому у вас меньше выходных файлов .
+0

Боковое примечание к 1: программа должна принимать подстановочные знаки в этом случае, а не только список имен файлов (что закончилось бы даже раньше из-за ограничения символа 8190 для командных строк в пакетных файлах). – Joey

0

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

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

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

Смежные вопросы