Войти

Показать полную графическую версию : Батник для запуска chkdsk по первым числам месяца


PowerZ
05-07-2014, 19:59
Всех приветствую!

Нужен батник, который будет запускаться через GPO, и выполнять следующие операции только по 01 числам:

1. Определение даты
2. Если дата = 01, то выполняется команда “echo y|chkdsk %systemdrive% /f /x” и c последующей перезагрузкой компьютера.
3. Если дата не ровняется 01, то ничего не происходит.

помогите пожалуйста, с батником.

Georgio
05-07-2014, 20:38
@echo off
for /f "delims=./" %%i in ("%date%") do (
for /f "tokens=* delims=0 " %%j in ("%%i") do (
if %%j==1 (
echo y| chkdsk %systemdrive% /f /x
)
)
)
exit /b

Iska
06-07-2014, 06:43
Вообще-то для этого предназначено «chkntfs.exe /c …» (и «fsutil.exe dirty set …», если так уж хочется принудительной проверки): Chkdsk (http://technet.microsoft.com/en-us/library/cc730714.aspx).

Примерно так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
`wmic.exe OS get LocalDateTime ^| findstr.exe /r /c:"......01.*"`
) do (
echo y|chkdsk.exe %SystemDrive% /f /x
shutdown.exe -r -t 10
)

endlocal
exit /b 0

PowerZ
06-07-2014, 12:19
Georgio и Iska, спасибо! Отрабатывают оба батника.

Проверил через GPO в домене на клиенте Win 7.

Только в первом варианте убрал пробел между «y| chkdsk», и добавил shutdown.exe -r -t 10 как во втором варианте.

Вообще-то для этого предназначено «chkntfs.exe /c …» (и «fsutil.exe dirty set …», если так уж хочется принудительной проверки): Chkdsk. »
Вы считает, что не совсем правильно выполнять проверку диска chkdsk?

Тут только возник один неприятный момент: происходит циклическая перезагрузка-проверка.

А можно ли, как нибудь приделать, чтобы проверка выполнялась только один раз в сутки?

А то даже если отказаться от команды «shutdown.exe -r -t 10», то все равно будет каждый раз при перезагрузке, в течении дня отрабатываться команда на проверку.

Iska
07-07-2014, 05:15
Тут только возник один неприятный момент: происходит циклическая перезагрузка-проверка.

А то даже если отказаться от команды «shutdown.exe -r -t 10», то все равно будет каждый раз при перезагрузке, в течении дня отрабатываться команда на проверку. »
Вы считает, что не совсем правильно выполнять проверку диска chkdsk? »
Вот поэтому я и привёл ссылку, чем можно заменить ;).

«Приделать»-то, конечно, всё можно, если вертеть в руках достаточно долго, но мне, в принципе, вовсе непонятен смысл Вашего желания назначать периодическую проверку системного раздела при загрузке системы в рамках групповой политики. Операционные системы на базе NT, как правило, вполне справляются сами с отслеживанием ситуаций, требующих проверки разделов на наличие ошибок (в отличие от старых ОС).

PowerZ
07-07-2014, 08:56
«Приделать»-то, конечно, всё можно, если вертеть в руках достаточно долго, но мне, в принципе, вовсе непонятен смысл Вашего желания назначать периодическую проверку системного раздела при загрузке системы в рамках групповой политики. Операционные системы на базе NT, как правило, вполне справляются сами с отслеживанием ситуаций, требующих проверки разделов на наличие ошибок (в отличие от старых ОС). »

Суть решения назначить проверку диска принудительно через групповые политики 1-раз в месяц такова, что когда начинаешь выполнять именно принудительно такую проверку, то примерно у 5-10 машин в сети (из 200), есть ошибки. Хотя да, согласен, что NT должны сами автоматом исправлять ошибки.
Парк машин 50/50 = XP/7 (не считая серверную часть). Ошибки возникают как на XP, так и на 7. Особенно статистика показывает, что больше возникает ошибок на машинах, где весь день сёрфят в интернете.
Сейчас на данный момент задача запуска один раз в месяц, - решается с помощью корпоративного касперского, через задачи (запихнул туда батник). Почему смотрю в сторону запуска через GPO? Потому что антивирус не на всех машинах есть.
Попробую изучить альтернативу chkntfs.exe

PowerZ
08-07-2014, 11:00
Пока сделал так:
@echo off
forfiles /p %systemdrive% /m chkdsk.log /d -1 /c "cmd /c del /q /f @file"
if not exist "%systemdrive%\chkdsk.log" (
for /f "delims=./" %%i in ("%date%") do (
for /f "tokens=* delims=0 " %%j in ("%%i") do (
if %%j==1 (
echo y|chkdsk %systemdrive% /f /x > %systemdrive%\chkdsk.log
shutdown.exe -r -t 10
)
)
)
)
exit /b
Со вторым батником не заработало.
Подскажите, как заменить forfiles удаление лога, на альтернативу, т.к. forfiles – нет в XP?

Iska
08-07-2014, 14:40
т.к. forfiles – нет в XP? »
Есть. Берите из комплектов Resource Kit'ов.

PowerZ
08-07-2014, 14:52
Взять forfiles конечно с Resource Kit'ов можно, но надо же распространить на все компы с XP в сети, тут уже другая заморочка. Хочется, чтобы из коробки было.
А если пойти другим путем, - как инвертировать батник, чтобы выполнялась команда "del файл" – всегда, кроме первого числа?

Опиум
08-07-2014, 17:42
но надо же распространить на все компы с XP в сети »
я в логон скрипте копирую частоиспользуемые, но некоробочные и\или самописные утилиты с сервера в %temp% рабочей станции. Оттуда и вызываю.

if not exist %temp%\myutil.exe copy \\server\share\myutil.exe %temp%\

Кстати..а что будет со станцией, которую, ну так вышло... никогда не включают 1-го числа?))

PowerZ
08-07-2014, 21:35
Вроде вопрос решен, но другим методом:
1. Отказался от запуска по первым числам (тут не так важно именно по первым числам, а главное один раз в месяц).
2. Нашел в сети альтернативный батник (http://www.celitel.info/klad/nhelp/helpbat.php?dcmd=ex_date) для удаления файла по истечению срока, в данном случае замена "forfiles"

Батник при запуске системы (выполняется удаление файла "chkdsk.log", по истечению 30 дней):

@echo off
setlocal enabledelayedexpansion
set N=30
set MASK=chkdsk.log
set SOURCE=%SYSTEMDRIVE%
call :raschet %date% days_to_today

pushd %SOURCE%
for /f "tokens=*" %%a in ('dir /b /a:-d %MASK%') do (
set filedate=%%~ta
call :raschet !filedate:~0,10! days_to_date_of_file
set /a raznitsa=%days_to_today%-!days_to_date_of_file!
if !raznitsa! gtr %N% del /q "%%a"
)
popd
exit

:raschet
for /f "delims=. tokens=1-3" %%a in ('echo %~1') do (

set /a years=%%c*365+%%c/4
set /a prev_year=%%c-1
set /a result_year=%%c/4
set /a result_prev_year=!prev_year!/4
set /a vis=!result_year!-!result_prev_year!
if !vis!==1 (
if %%b==01 set /a years=!years!-1
if %%b==02 set /a years=!years!-1
)

if %%b==01 set months=0
if %%b==02 set months=31
if %%b==03 set months=59
if %%b==04 set months=90
if %%b==05 set months=120
if %%b==06 set months=151
if %%b==07 set months=181
if %%b==08 set months=212
if %%b==09 set months=243
if %%b==10 set months=273
if %%b==11 set months=304
if %%b==12 set months=334

set days=%%a
set firstsym=!days:~0,1!
if !firstsym!==0 set days=!days:~1,1!

set /a %~2=!years!+!months!+!days!
)


Батник при завершение работы системы (выполняется проверка существования файла "chkdsk.log", если нет, то выполняет chkdsk, и при следующем перезагрузке будет произведена проверка и исправление диска на ошибки).


@echo off
if not exist "%systemdrive%\chkdsk.log" (
echo y|chkdsk %systemdrive% /f /x > %systemdrive%\chkdsk.log
)
exit /b

Georgio
08-07-2014, 21:35
Подскажите, как заменить forfiles удаление лога, на альтернативу, т.к. forfiles – нет в XP? »

for %%i in ("%systemdrive%\chkdsk.log") do (
for /f %%j in ("%%~ti") do (
if not %%j==%date% (
echo del /q /f %%i
)
)
)


А если пойти другим путем, - как инвертировать батник, чтобы выполнялась команда "del файл" – всегда, кроме первого числа? »

@echo off
for /f "delims=./" %%i in ("%date%") do (
for /f "tokens=* delims=0 " %%j in ("%%i") do (
if not %%j==1 (
del /a /f "some file"
)
)
)
exit /b




© OSzone.net 2001-2012