upd 2019.10.23: отключил принудительное логгирование и уменьшил таймауты между попытками неуспешной записи в лог
upd 2019.02.11: вынес списки исключений (не будут удаляться) каталогов и файлов в блок определения переменных, сделал логгирование всех выполняемых действий.
Написан на JScript (WSH), при запуске по даблклику перед очисткой задаёт вопрос о необходимости закрыть клиент 1С и закрывает только клиенты 1С запустившего скрипт пользователя (можно использовать на терминальном сервере, не боясь загасить чужие клиенты 1С).
Поддерживает запуск с параметрами командной строки:
/DontClose1cClient=1 - не закрывать клиент 1С при очистке
/ClearAll=1 - очищает кэш 1С всех пользовательский профилей без дополнительных вопросов, можно сразу у всех пользователей терминального сервера.
Код прикреплённого файла ниже:
WScript.Echo("Будет выполнена очистка кэша 1с");
var _fso = new ActiveXObject("Scripting.Filesystemobject");
var _wShell = new ActiveXObject("WScript.Shell");
var _wshNetwork = new ActiveXObject("WScript.Network");
var wmi = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMV2";
var _wmi = GetObject(wmi);
var _win_ver = _wShell.ExpandEnvironmentStrings(_wShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\CurrentVersion"));
var _profiles_path = _wShell.ExpandEnvironmentStrings(_wShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\ProfilesDirectory"))
var _user_profile = _wShell.ExpandEnvironmentStrings("%USERPROFILE%");
var _clear_all = _parse_bool_argument("ClearAll");
var _pids = "";
var stop_1cv8 = 'cmd /c taskkill.exe /f /im 1cv8*';
var stop_1cestart = 'cmd /c taskkill.exe /f /im 1cestart.exe';
var stop_1c_part = 'cmd /c taskkill.exe /f /pid '
var _sel_logged_users = "SELECT * FROM Win32_LoggedOnUser";
var _sel_sesn_prcs = "SELECT * FROM Win32_SessionProcess";
var _sel_prcs_by_pid = "SELECT * FROM Win32_Process WHERE (Name like '1cv8%' or Name like '1cestart%') and (";
var vbYesNo = 4;
var vbYes = 6;
var exceptDirectories = ["1CEStart","Licence 2.0","tmplts"];
var exceptFiles = ["LOCATION.CFG","1CV8STRT.PFL","APPSRVRS.LST","IBASES.V8I"];
if(_win_ver == "5.1"){
var user_app_1c = "\\Application Data\\1C"
var user_lcl_1c = "\\Local Settings\\1C"
}else{
var user_app_1c = "\\AppData\\Roaming\\1C"
var user_lcl_1c = "\\AppData\\Local\\1C";
}
//киляем процессы 1с
log_w("Started by "+_wshNetwork.UserDomain+"\\"+_wshNetwork.UserName);
if(_clear_all){
log_w("Очищаю кэш 1С для всех профилей");
if(!_parse_bool_argument("DontClose1cClient")){
log_w("Завершаю работу всех клиентов 1С");
RunAndRead(stop_1cv8);
RunAndRead(stop_1cestart);
}
_profiles = new Enumerator(_fso.GetFolder(_profiles_path).SubFolders);
for (;!_profiles.atEnd(); _profiles.moveNext()){
_clean_profile(_profiles.item());
}
}else{
log_w("Очищаю кэш текущего пользователя");
for(var logged_users = new Enumerator(_wmi.ExecQuery(_sel_logged_users));!logged_users.atEnd(); logged_users.moveNext()){
var acc = logged_users.item().Antecedent;
var logon_id = logged_users.item().Dependent;
var _logged_user_rexp = eval("/"+_wshNetwork.UserName+"/gi");
if(_logged_user_rexp.test(acc)){
for(var sess_prcs = new Enumerator(_wmi.ExecQuery(_sel_sesn_prcs));!sess_prcs.atEnd(); sess_prcs.moveNext()){
var p1 = sess_prcs.item().Antecedent;
var p2 = sess_prcs.item().Dependent;
var _pid_rexp = /Handle="\d+"/gi;
if(p1 == logon_id){
_pids += _pid_rexp.test(p2)?"ProcessId="+((p2.match(_pid_rexp))[0]).replace('Handle="',"").replace('"',"")+" or ":"";
}
}
//WScript.Echo(logon_id);
}
}
_pids = _pids.replace(/\sor\s$/gi,"")
//WScript.Echo(_pids);
var _sel_only_my_1c = _sel_prcs_by_pid+_pids+")";
var c1s = new Enumerator(_wmi.ExecQuery(_sel_only_my_1c));
if((!c1s.atEnd())&&(_wShell.popup("Для продолжения необходимо закрыть 1с. Продолжаем?",0,"Подтверждение",vbYesNo)==vbYes)){
log_w("Получено согласие на закртие клиентов 1С текущего пользователя");
for(;!c1s.atEnd();c1s.moveNext()){
c1s_cl = c1s.item();
if(!_parse_bool_argument("DontClose1cClient")){
cmd = stop_1c_part+c1s_cl.ProcessID;
log_w("Завершаю "+cmd);
RunAndRead(cmd);
}
}
}
_clean_profile(_user_profile);
}
WScript.Echo("Кэш очищен");
function _parse_bool_argument(pa_arg_name){
var pa_string = "";
for(var pa_i = 0; pa_i<WScript.Arguments.length; pa_i++){
pa_string += WScript.Arguments(pa_i)+" ";
}
pa_re = eval("/"+pa_arg_name+"[\\s=-]{1}[\\w\\d]+/gi");
var pa_arr = pa_re.exec(pa_string);
if(pa_arr != null){
pa_replace = eval("/"+pa_arg_name+"[\\s=-]{1}/gi");
pa_val = pa_arr[0].replace(pa_replace,"").toUpperCase();
switch(pa_val){
case "TRUE" : pa_ret = true;break;
case "1" : pa_ret = true;break;
case "FALSE": pa_ret = false;break;
case "0" : pa_ret = false;break;
default : pa_ret = false;break;
}
}else{
pa_ret = false;
}
return pa_ret;
}
function RunAndRead(rar_command){
var rar_FSO = new ActiveXObject("Scripting.FileSystemObject");
var rar_VSH = new ActiveXObject("WScript.Shell");
var rar_outname = rar_VSH.ExpandEnvironmentStrings("%TEMP%")+"\\"+rar_FSO.GetTempName();
var rar_str = rar_command+' > "'+rar_outname+'"';
rar_VSH.run(rar_str, 0, true);
if(rar_FSO.fileexists(rar_outname)){
if(rar_FSO.getfile(rar_outname).size>0){
var rar_in = rar_FSO.opentextfile(rar_outname);
var rar_ret = rar_in.readall();
rar_in.close();
}
else{rar_ret = "Empty output";}
rar_FSO.deletefile(rar_outname);
}else{rar_ret = "No output"}
rar_FSO = null;
rar_VSH = null;
rar_outname = null;
rar_str = null;
rar_in = null;
return rar_ret.replace(/^\r\n|(\r\n){2,}|\r\n$/gi,"");
}
function _clean_profile(cp_path){
if(_fso.folderexists(cp_path+"\\"+user_app_1c)){
ClearSubFolders(cp_path+"\\"+user_app_1c)
}
if(_fso.folderexists(cp_path+"\\"+user_lcl_1c)){
ClearSubFolders(cp_path+"\\"+user_lcl_1c)
}
}
function ClearSubFolders(objFolder){
var subfolder;
var filename;
var csf_subfolders = new Enumerator(_fso.GetFolder(objFolder).SubFolders);
for(;!csf_subfolders.atEnd();csf_subfolders.moveNext()){
subfolder = csf_subfolders.item()
if(!in_array(subfolder.name,exceptDirectories)){
var sf_path = subfolder.Path;
log_w("Очищаю "+sf_path);
ClearSubFolders(sf_path)
try{
if(/1cv8\d*/gi.test(subfolder.Name)){
RunAndRead('cmd /c rmdir "'+sf_path+'"')
}else{
RunAndRead('cmd /c rmdir /S /Q "'+sf_path+'"')
}
}catch(e){
log_w("Не смог удалить "+sf_path);
}
}else{
log_w(subfolder.Path + " в списке исключений");
}
}
var csf_files = new Enumerator(_fso.GetFolder(objFolder).Files)
for(;!csf_files.atEnd();csf_files.moveNext()){
var ffile = csf_files.item();
var fname = ffile.Path;
if(!in_array(ffile.name,exceptFiles)){
try{
_fso.deletefile(ffile);
log_w("Удалён "+fname);
}catch(e){
log_w("Не смог удалить "+fname);
};
}
}
}
function in_array(value, array) {
for(var i = 0; i<array.length; i++){
if(value.toUpperCase() === array[i].toUpperCase()) {
return true;
}
}
return false;
}
function log_w(lw_text_t){
var wait_limit = 999;
var wait_count = 0;
var lw_recorded = false
while(!lw_recorded){
if(wait_count <= wait_limit){
try{
var lw_fso = new ActiveXObject("Scripting.Filesystemobject");
var dateObj = new Date();
var lw_log = WScript.ScriptFullName+".log";
lw_log_file = lw_fso.OpenTextFile(lw_log,8,true);
lw_log_file.WriteLine( dateObj.getFullYear()+"."
+((dateObj.getMonth()+1>9)?dateObj.getMonth()+1:"0"+(dateObj.getMonth()+1))+"."
+((dateObj.getDate()>9)?dateObj.getDate():"0"+dateObj.getDate())+"-"
+((dateObj.getHours()>9)?dateObj.getHours():"0"+dateObj.getHours())+":"
+((dateObj.getMinutes()>9)?dateObj.getMinutes():"0"+dateObj.getMinutes())+":"
+((dateObj.getSeconds()>9)?dateObj.getSeconds():"0"+dateObj.getSeconds())+":"
+((dateObj.getMilliseconds()>99)?dateObj.getMilliseconds():((dateObj.getMilliseconds()>9)?"0"+dateObj.getMilliseconds():"00"+dateObj.getMilliseconds()))+"="
+lw_text_t);
lw_log_file.close();
lw_log_file = null;
lw_fso = null;
lw_log = null;
dateObj = null;
lw_recorded = true;
}
catch(e){
WScript.Sleep(100);
wait_count++;
lw_recorded = false;
}
}
else{
WScript.Echo("Не смог записать сообщение "+lw_text_t+"\r\nв файл "+WScript.ScriptFullName+".log");
lw_recorded = true;
}
}
}