У меня есть задача в планировщике задач на файловом сервере Windows 2012. Задача должна удалять содержимое временного каталога общего доступа каждую ночь в воскресенье. Он запускается в запланированное время и каждый раз сообщает об успешном выполнении, но содержимое каталога не удаляется.
В задачу входит этот батник:
D:
cd D:\Shared\Temp\
del /Q /F /S "D:\Shared\Temp\*.*"
Это xml задачи:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2014-06-16T12:13:45.8524361</Date>
<Author>OFFICE\Administrator</Author>
<Description>Weekly deletes the contents of the Temp directory</Description>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2014-06-22T20:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Sunday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>OFFICE\Administrator</UserId>
<LogonType>Password</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>false</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"D:\IT\tempdelete.bat"</Command>
</Exec>
</Actions>
</Task>
Я не могу понять, почему эта задача не выполняет то, что должна. Может ли кто-нибудь с большим опытом пролить свет на это?
Обновление 11 августа 2014 г.
Здесь был еще один ответ, который предлагал следующее редактирование в моей пакетной команде (я не знаю, почему он был удален):
D:
cd D:\Shared\Temp\
del /F /S "D:\Shared\Temp\*.*" 1> D:\my.log 2>&1
В эти выходные я запустил этот сценарий. Планировщик заданий по-прежнему утверждает, что работа завершена успешно, но на этот раз у меня есть противоречивый файл my.log:
The system cannot find the path specified.
Я не вижу ошибки определения пути в своем скрипте. Указанный путь правильный.
Нужно ли мне не изменить каталог, как заявляет joeqwerty?
или
Следует ли мне также указать в скобках изменение каталога?
или что???
Я могу думать о двух возможностях.
1) Файлы добавляются после завершения запланированной задачи. Но я подозреваю, что вы проверяете отметки времени и видите даты, предшествующие задаче. Так что проблема, наверное, не в этом.
2) Один или несколько файлов могут быть заблокированы другим процессом, что предотвратит удаление.
К сожалению, команда DEL не возвращает код ошибки в случае сбоя. Он выводит сообщение об ошибке в stderr, но возвращаемый ERRORLEVEL всегда равен 0.
Вы можете подтвердить, что заблокированные файлы вызывают проблему, перенаправив stderr для вашей команды DEL в файл, используя 2>somePath\someFile.log
. Если произошел сбой, вы должны увидеть сообщение об ошибке, например The process cannot access the file because it is being used by another process.
в файле журнала.
Если вы хотите обнаружить и принять меры, если один или несколько файлов заблокированы, вы можете использовать вариант Как остановить пакетный скрипт при сбое del.
set "locked="
for /r "D:\Shared\Temp" %%F in (.) do dir /a-d "%F" >nul 2>nul && (ren "%F\*" * || set locked=1)
if defined locked echo Take some action because files are locked.
Переименование файлов в их исходное имя не удастся, если один или несколько файлов заблокированы. Но не стоит проводить тест, если в данной папке нет файлов. Команда DIR / A-D определяет, содержит ли данная папка файлы. Команда FOR / R выполняет итерацию по всем папкам, включая указанный корень.
РЕДАКТИРОВАТЬ
Я должен был прочитать ссылку, которую я цитировал далее. Внизу приведены ответы, которые дают более прямой способ обнаружения неудачного удаления без использования дополнительной команды для обнаружения открытых файлов. Просто проверьте вывод команды DEL на stderr. Дох!
del /Q /F /S "D:\Shared\Temp\*.*" 2>&1 1>nul | findstr "^" >nul && echo Take action because one or more files were locked and could not be deleted
Это решение лучше, потому что оно обнаруживает ошибку DEL напрямую. Поиск заблокированных файлов отдельной командой может завершиться неудачно, если файл заблокирован после проверки блокировки, но до удаления.