2015-01-28 3 views
0

У меня есть пакетный файл DOS, который создаст отчет, содержащий список файлов, содержащийся в дереве папок. Код ниже дает желаемый результат для более чем 115 000 файлов. Тем не менее, 13 записей создаются с пустой датой/временем и размером файла. Когда я вручную выполняю команду DIR (без опции/b), отображается информация о требуемом файле. Может ли это быть исправлено без добавления значительного кода обхода?DOS Batch File Variable Modifier Returns Blank

FOR /f "tokens=*" %%A IN ('DIR "<Path>" /a:-d /b /s') DO (
    ECHO %%~tA %%~zA %%~dpA %%~nA %%~xA >> test.txt 
) 
+3

Что-нибудь общее об этих 13 файлах? Мы не можем помочь, не понимая этого. –

+0

Добавьте '%% ~ fA' в свою подкоманду' echo' (не решая, но должны отображать хотя бы полные имена файлов) и [посмотрите здесь] (http://stackoverflow.com/a/28208711/3439404) – JosefZ

ответ

1
(FOR /f "tokens=*" %%A IN ('DIR "<Path>" /a:-d /b /s') DO (
    if exists "%%~A" ECHO %%~tA %%~zA %%~dpA %%~nA %%~xA 
)) >> test.txt 

Основной причиной не получения даты/размер файла, что файл не может быть найден.

Как работает ваш код?

for /f запускает отдельный экземпляр cmd, который запускает команду dir.

Когда все данные были получены и загружаются в память (то есть, команда cmd/dir закончила), то for начнет перебирать извлекаемые строки. Прошло некоторое время между поиском информации и обработкой информации.

В это время «возможно» проблемные файлы были перемещены/удалены/переименованы, и к ним невозможно получить доступ к их свойствам. Итак, сначала проверьте, существует ли файл до сих пор

Изменения в скобках и переадресации, чтобы избежать открытия целевого файла для каждой операции echo. Таким образом, файл открывается в начале команды for и закрывается в конце.

+0

Спасибо за комментарии к оптимизации кода. К сожалению, я не могу найти шаблон для файлов (например, специальные символы в имени файла, старых файлах и т. Д.). Проблемные файлы повторяются и не перемещаются и не изменяются во время исполнения командного файла. – DAO