Войти

Показать полную графическую версию : Проверка в каталогах файлов с расширением .tmp


upward
12-03-2014, 21:55
Написать пакетный файл, который будет проверять в каталогах, указанных в качестве параметров, наличие файлов с расширением .TMP и удалять их. Если пути поиска не заданы, вывести сообщение. Создать протокол удаляемых файлов.
Вот,что я набросал,но что-то не создается файл protocol.txt,где,что я забыл?


@echo off
set d=D:\1
If Exist %file% Goto Loop
:Loop
del /s D:\1\*.tmp
>protocol.txt


Спасибо.

Georgio
12-03-2014, 23:21
@echo off
chcp 1251>nul

set d=D:\1
set file=*.tmp

del /s "%d%\%file%">protocol.txt
exit /b

Iska
12-03-2014, 23:25
что я забыл? »
Указать, чей stdout перенаправлять в файл. И ещё кучу всего прочего.

upward
13-03-2014, 10:32
Iska, подскажите,а как организовать обработчик ошибок?
2.12. Протестировать разработанные командные файлы при различных исходных данных: без параметров, при некорректно заданных параметрах, при различном количестве параметров.

Гуллипут
16-03-2014, 15:22
Georgio, насчёт вот этой строчки: chcp 1251>nul » Сколько лет я пишу bat-файлы - ни разу необходимости в этой строке не было. Просто создаю их в кодировке ASCII, которую Microsoft зачем-то переименовала в OEM. При этом, когда я пробовал вставить такую строку, это никак не меняло дела, и всё равно, для того, чтобы русский текст выводился не зюками, приходилось создавать файл в ASCII.
Многие рекомендуют эту строку, но я никак не пойму, почему.

Хотя вот сейчас попробовал добавить эту строчку, и, действительно, пришлось перевести в ANSI. Возможно, что раньше я как-то не так проверял. Подумаю, не стоит ли перейти на такой вариант. Но пока меня кодировка ASCII устраивала.

Гуллипут
16-03-2014, 15:39
@echo off
set pathes=%*

setlocal EnableExtensions
if not defined pathes set /P pathes=Введите список путей, разделённых пробелами:

copy nul protocol.txt

for %%d in (%pathes%) do (
If Exist %%d\*.tmp (
for %%f in (%%d\*.tmp) do (
del /q "%%f"
if not exist "%%f" (echo %%f >>protocol.txt ) else (echo не удалось удалить %%f >>protocol.txt)
)
)
)
Вот такой вариант должен работать. При этом, если в путь входит пробел, значит, надо заключить этот путь в кавычки.
Пришлось немного повозиться, зато теперь взял на вооружение ещё одну возможность, которую знал, но пока не использовал: if not defined.

Гуллипут
16-03-2014, 16:04
del /s "%d%\%file%">protocol.txt » А такой вариант я проверил, но, даже если файл занят и не удалился, всё равно выдаётся сообщение, что он удалён.
Хотя не знаю, насколько это важно, поскольку после того, как его освободили, он всё равно удалился. Видимо, NTFS пометила его на удаление при первой возможности.

ShaddyR
16-03-2014, 17:59
Мне тут, походу, скучно было... вот результат:

@echo off & set dpath=D:\1\
set dext=*.tmp
set msgtop=Протокол очистки папки "%dpath%" от файлов %dext% ( %date% %time% )
set msgbtm=Работа скрипта завершена.
set err1=Указанная папка не существует либо доступ к ней запрещен!
set err2=Файлы указанного типа не обнаружены!
echo %msgtop% &echo. &cd %dpath% || echo %err1% &&echo. &&echo %msgbtm% &&exit 1
echo %msgtop%>%~dp0\protocol.txt &echo. >>%~dp0\protocol.txt &del /s /q "%dpath%\%dext%" >>%~dp0\protocol.txt &findstr ^Удален %~dp0\protocol.txt ||echo %err2% &&echo %err2% >>%~dp0\protocol.txt
echo. &echo. >>%~dp0\protocol.txt &echo %msgbtm% &echo %msgbtm% >>%~dp0\protocol.txt &echo. &set /p prmt=Вывести на экран протокол?[1]
if %prmt%==1 cls &type %~dp0\protocol.txt &pause

Видимо, NTFS пометила его на удаление при первой возможности. »
файловая система не занимается ничем подобным. Файл был удален родительским процессом - программой, которой был создан.

Гуллипут
16-03-2014, 23:07
файловая система не занимается ничем подобным. Файл был удален родительским процессом - программой, которой был создан. »
Ничего подобного. Я знаю, что говорю: создавал файл для тестирования я сам, сделал его занятым с помощью просмотра в Far Manager, затем прогнал bat-файл, проверил, что tmp-файл не удалился, затем освободил tmp-файл - и он сразу же исчез. Возможно только, что это сделала ОС, а не файловая система. Но я помню, что именно в NTFS была какая-то возможность заказать отложенное удаление занятого файла, поэтому считаю, что это была файловая система.

Iska
17-03-2014, 00:31
сделал его занятым с помощью просмотра в Far Manager »
viewer.cpp (http://farmanager.googlecode.com/svn/trunk/unicode_far/viewer.cpp):
ViewFile.Open(strFileName, FILE_READ_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, nullptr, OPEN_EXISTING);

Гуллипут
17-03-2014, 08:53
viewer.cpp:
Код:
ViewFile.Open(strFileName, FILE_READ_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, nullptr, OP »
Ну, мне проще через Far. Тем более, что C++ у меня нет.

Iska
17-03-2014, 12:43
Гуллипут, это и есть — Far Manager, код, реализующий открытие файла для просмотра.

Гуллипут
18-03-2014, 22:50
Гуллипут, это и есть — Far Manager, код, реализующий открытие файла для просмотра. »
Да ну ?! А откуда у вас исходный код Far Manager ?

Iska
19-03-2014, 00:48
Да ну ?! »
Ну да.

А откуда у вас исходный код Far Manager ? »
Я же привёл ссылку. Вот ещё одна: исходный код (http://farmanager.com/opensource.php?l=ru).




© OSzone.net 2001-2012