<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
а где файл? ❓
Более простой вариант сделать батник с текстом
shutdown /s /f
Даже как-то пугает программа которая только выключает компьютер и
при этом ее размер 4 Мб.
Проще как-то так:
Dim Time
Time = InputBox(«Введите время в минутах»)
WScript.Sleep 1000 * 60 * Time
Set WSHShell = WScript.CreateObject(«WScript.Shell»)
WSHShell.Run «shutdown.exe -f -s»
размер 471 кб, а не проще нажать кнопку «применить»?
(2) Зачем батник, если «shutdown /s /f» идеально прописывается в шедулер. Только нужно бы добавить ключ /t, на всякий пожарный, правильней будет выглядеть.
А в шедулер можно добавить с помощью «schtasks». Батничком со своей машины сразу по всем включенным компьютерам в сети.
P.S. Хе-хе. Скоро появятся программеры, пишушие специальные программы для копирования файлов из папки в папку. Или такие уже есть?
(5). Уже есть. Сам видел.
Все равно пугает 😮
создаешь бат файл с таким содержимым
shutdown -s -f -t 1
, где ключик -t дает возможность установить время задержки выключения в секундах, также можно запускать этот командный файл в шедулере.
(8) Может я чего-то не понимаю, объясните мне тогда: зачем делать батник с одной коммандой, что мешает вызвать shutdown.exe прямо из планировщика? Или создать ярлык на «shutdown -s -f -t 1» если уж хочется выключать компьютер без вопросов кликом на иконке.
(9) Как-то батником «поуниверсальнее» что ли получается. Если что и подправить можно параметры не лазая в шедулер.
(10) Вот тут то и ждет большая дыра в безопасности. Автору нужно тушить пользовательские компьютеры без участия пользователя. Если команда прописана в батничке, этот батничек нужно еще переписать на пользовательский комп и позаботиться, что бы ушлый пользователь не смог его поменять, таким образом, что бы вместо завершения работы что-то другое запустилось с правами задания в планировщике (от админа, с правами пользователя не факт, что получится компьютер гарантированно погасить). Получаются лишние телодвижения (подготовить батник, распространить по компам, назначить на него права) вместо того, что бы просто одной командой прописать на удаленном компе команду в планировщик.
for /f «tokens=1 delims= » %i in (‘net view #k8SjZc9Dxk| findstr «\»‘) do @SCHTASKS /Create /S %i /U Администратор /P пароль /RU Администратор /RP пароль /SC DAILY /TN «Выключение» /TR «C:WindowsSystem32shutdown.exe -s -f -t 1»
Команду писал без проверки, за правильность не ручаюсь.
(11). Во-первых: Проблема безопасности решается назначением прав доступа к файлу.
Во-вторых: Если имеем AD копировать гораздо проще.
Давайте не будем углубляться в администрирование — рискуем утонуть -)))
Вообще-то сам факт авт. шатдауна довольно спорный. Представьте — пользователь делает работу, а тут его бац и нету. Я бы на его месте взялся за оружие -))
Для меня интересна связка бэкапа и шатдауна на сервере. Например, в определенное время запускается скрипт на серваке гасит пользовательские соединения делает бэкапы и гасит себя.
ИМХО это может быть актуально для небольших фирм
(12) Согласен, не будем углубляться в администрирование.
Как я понимаю, вопрос у автора стоял так, что все пользователи в 18:00 дружно уходят домой и начинает делаться на пользовательских компьютерах резервная копия. А сервера, похоже, там вообще не было, уж не говоря об АД. Задача, конечно, про сферического коня в вакууме, притом этот конь явно хромает на пару ног. Хотя, наверное, для мелкой конторы, где в качестве сервера выступает пользовательская машина и утром времени делать архивы нет, потому что все работать хотят… Решение «уходишь — запусти архивирование» подходяще.
(13) А что там может быть интересного? Банальная админская задача. В определенное время, когда все пользователи должны уже уйти домой, закрываешь все терминальные сеансы и сетевые подключения, удаляешь потенциально битые после сброса сетевых подключений *.CDX, архивируешь, запускаешь в автоматическом режиме конфигуратор, что бы индексы перестроил. И все.
(14)
в том, то все и дело — как то ненадежно все это выглядит. А если не перестроит он индексы, имеем утром полчаса перекура на индексацию. А лучших вариантов 1С в файловом режиме и не даст.
Ну а в остальном согласен. Хотя в последнее время юзверя пошли грамотные — спрашивают про бэкапы, сервера и пр.
Что не может не радовать — умнее становимся.
(15)
http://www.forum.mista.ru/topic.php?id=114372 ).
1. Перед запуском ночных автоматов убивать процессы 1cv7*.exe на сервере с помощью штатной виндовой taskkill. Можно, если нельзя убивать или не хочется, проверять, например, утилитой 1cusrmon.exe, есть ли кто в базе.
2. Проверить, зарегистрирована ли база в реестре, если нет, зарегистрировать. Штатная утилита reg.exe.
2. Удалить из каталога 1С и базы файлы *.tip, что бы «советы дня» выскакивать не могли.
3. Проверять, нужна ли переиндексация, что бы зазря базу не дергать (см. тут
4. После переиндексации проверь необходимость переиндексации по 3 и зацикли скрипт. Желательно с уведомлением себя по электронной почте или SMS.
Я каких-то заметных проблем с надежностью не наблюдал. Ну подвиснет иногда 1С при запуске. У меня это редко, некритично и бывает только при дневном запуске автообмена РБД. При желании не сложно штатной утилитой schtasks выгрузить в файл отчет о состоянии задач в планировщике и проверить, а не слишком ли долго выполяется определенная задача.
Денёк повозиться, что бы написать хороший скрипт со всеми нужными проверками и уведомлениями и проблема будет снята.
Не понял смысла этого пункта.
А вообще большой жирный плюс.
(17) Ну ты же жаловался «как то ненадежно все это выглядит. А если не перестроит он индексы, имеем утром полчаса перекура на индексацию». Я и советую — проверь после индексации необходимость повторной индексации (а вдруг, мало ли что), и если нужна — выполнить скрипт с начала.
(17) Понял, спасибо