подскажите по vbs

  1. 10 г. назад

    в скрипте - получаю файл, читаю его по строкам.
    как найти строку, в которой есть нужная мне подстрока.

    общая задача - хочу получить ID базы из файла ibases.v8i

    вот код:

    Set fs = CreateObject("Scripting.FileSystemObject") 
    set f=fs.OpenTextFile("%userprofile%\Application Data\1C\1CEStart\ibases.v8i", 1, 0,fformat) 
    Do While f.AtEndOfStream<>True 
     Ll = f.ReadLine() 
    
    ' здесь код на то, что BaseName входит в состав строки LI
    
    Loop
    
    Ответы: (13) (53) (68) (71)
  2. тебе ссылку на мануал по текстовым функциям vbs надо, или чо? :)

    Ответы: (2) (3)
  3. (1) Нет. Ему 34 см мешают [smile=:D]

  4. (1) опять ты со своими манулами..)
    мне рыба нужна! удочку потом!

  5. InStr Returns the position of the first occurrence of one string within another. The search begins at the first character of the string
    InStrRev Returns the position of the first occurrence of one string within another. The search begins at the last character of the string
    LCase Converts a specified string to lowercase
    Left Returns a specified number of characters from the left side of a string
    Len Returns the number of characters in a string
    LTrim Removes spaces on the left side of a string
    RTrim Removes spaces on the right side of a string
    Trim Removes spaces on both the left and the right side of a string
    Mid Returns a specified number of characters from a string
    Replace Replaces a specified part of a string with another string a specified number of times
    Right Returns a specified number of characters from the right side of a string
    Space Returns a string that consists of a specified number of spaces
    StrComp Compares two strings and returns a value that represents the result of the comparison
    String Returns a string that contains a repeating character of a specified length
    StrReverse Reverses a string
    UCase Converts a specified string to uppercase

    Ответы: (6)
  6. Stim мне рыба нужна!

    вот ты деловой какой. за тебя код написать, а з/п ты получать будешь? :)

    http://www.spravkaweb.ru/vbscript/text
    http://www.script-coding.com/WSH/Functions.html

    Ответы: (6)
  7. (4)(5) пасиба
    а можно ведь вообще регулярное выражение к строке применить!

    Ответы: (7)
  8. (6) не мона, а нуна! ©

  9. вот они, фанаты регулярных выражений, лови их)

  10. 08.05.2014 11:47:50 отредактировано andrewks

    + чота нифига не работает

    LL = f.readline ()
    NumSML = Instr(1,LI,"моябаза")
     txtStreamOut.WriteLine  NumSML & Ll
    

    в файле:
    0Connect=Srvr="Serv:1641";Ref="моябаза";

  11. 08.05.2014 11:48:13 отредактировано Stim

    аа.. что за разгилдяйство..
    код

    Ll = "123"
     Seach = "123"
    NumSML = Instr(1,LI,Seach)
    
    

    выдает, что NumSML = 0

    почемубля?

    Ответы: (11) (14)
  12. (10) ты лучше скажи, откуда ты берёшь code=<Auto> ?

    Ответы: (12)
  13. (11) с твоей же панели выбора типа кода) в 0 такое сработало

    Ответы: (13)
  14. 08.05.2014 11:51:24 отредактировано andrewks

    (12) моя панель выбора выдаёт code=_auto_ , поэтому мне и стало интересно, откуда у тебя берётся code=<Auto>

    в (0) - code=_auto_

    Ответы: (15)
  15. (10) у тебя поиск начинается с 1-го символа "123" в "23" нет

    Ответы: (16)
  16. (13) скорее всего это потому, что у меня на странице включается автоматический гугло переводчек

  17. (14)поиск с первого символа, да. с "1"
    нулевого символа в строке какбе нет

  18. Ll <> LI

    Ответы: (22)
  19. Ll = "111123"
     Seach = "123"
    NumSML = Instr(1,LI,Seach)

    тоже выдает NumSML = 0

  20. Stim нулевого символа в строке какбе нет

    это в глупом vbs его нет, а везде он есть :)

    Ответы: (20)
  21. (19) и в 1С тоже нет.
    а других языков и не бывает

  22. ну чего там по сабжу?
    не работает ваша Instr()

    Ответы: (22)
  23. (21) см. (17)

  24. Удаление файла:

    FF = "путь к файлу"
    Set Fso = WScript.CreateObject("Scripting.FileSystemObject")
    
    If  Fso.FolderExists(FF) Then
    set f = fso.GetFile(FF)

    ругаетсо на посл строку, что-то типа такого файла не существует

  25. Fso.DeleteFolder(FF)

    ОК

  26. еще:

    set f=fs.OpenTextFile( "%userprofile%\Application Data\1C\1CEStart\ibases.v8i", 1, 0,fformat)

    грит - не могу найти файл

  27. + хотя суслик - есть

  28. полный путь попробуй

    Ответы: (28)
  29. (27) полный путь работае

  30. + пуск - выполнить - строка из 25 открывает

  31. set f=fs.OpenTextFile( %userprofile%+"\Application Data\1C\1CEStart\ibases.v8i", 1, 0,fformat)

    выдает синтакс ошибку

  32. Да Екселя тебе хватит, там почитай. Сейчас вон переводчики какие пошли модные. Технический мануал не проблема перевести.

  33. разобралсо

  34. + еще вопросик- удаляю файл в скрипте. как сделать что-то типа попытки на vbs? чтобы скрипт не вылетал с ошибкой, а продолжал дальше

    Ответы: (35)
  35. Try-Catch-End

  36. (33) Там же и читай. Один раз научишься - вообще спецом станешь. Главное живи на зарплату и все, времена меняются, вот и меня подкосило, чуть не завещание написал, очнулся. Все. Типа получил себе пенсию по инвалидности.:)

  37. 12.05.2014 11:25:39 отредактировано Stim

    хм.

    If  Fso1.FolderExists(FF) Then
    
    try { 
    Fso1.DeleteFolder(FF)
       } catch(e){ 
     txtStreamOut.WriteLine   "не удалось удалить темп"
       } 
    

    ругаетсо на систаксис в строке с try

    Ответы: (38)
  38. + и вообще Try-Catch - это яваскрипт

  39. (36) Епта откуда в ВБС фигурные скобки?

    Ответы: (41)
  40. Try
    Throw 2 'How do I throw an exception?
    Catch ex
    'What do I do here?
    End Try

  41. И это ... В начало скрипта вставь
    On Error Resume Next
    И будет те счастье )) Все будет работать ))))))))))

    Ответы: (42)
  42. (38) +1 мне тоже интересно

  43. (40) ты хочешь зациклить?

  44. 12.05.2014 11:40:19 отредактировано Stim
    Try
    Fso1.DeleteFolder(FF)
    Catch ex
     txtStreamOut.WriteLine   "не удалось удалить темп"
    End Try

    не работает. грит ожидается "If" на строчке с End. если убрать строчку с end вообще, ругается на try

    Ответы: (44) (46)
  45. (43) Весь скрипт в студию

    Ответы: (45)
  46. (44) там ничего такого, просто удаление файла с обработкой исключения

    Set Fso1 = WScript.CreateObject("Scripting.FileSystemObject")
    FF = "путь к файлу"
    If  Fso1.FolderExists(FF) Then
    Try 
    Fso1.DeleteFolder(FF)
    Catch ex
     txtStreamOut.WriteLine   "не удалось удалить файл"
    End Try
    End if
  47. (43) прошу прощения, я нагнал. в vbs try-catch нету. можешь меня пнуть (только не больно :) )

    Антон правильно говорит, директиву надо задать On Error Resume Next

    ЗЫ ну и *овно этот ваш vbs

    Ответы: (47)
  48. (46)это типа ВыполнитьНесмотряНиНаЧтоИНеПоказыватьОшибок в 1С ?

    Ответы: (49)
  49. + и как все-таки обработать исключение?

  50. (47) вот здесь есть извращённый метод, имитирующий попытку в vbs
    http://www.daniweb.com/software-development/visual-basic-4-5-6/threads/233842/try-catch-feature-for-vb6-vba-vbscript

  51. Личное  Sub Form1_Load ( ByVal отправителя Как системы . Object ,  ByVal электронной Как система . EventArgs )  Ручки  MyBase . Нагрузка
            Пытаться
            Поймайте экс Как Exception
            В конце концов
            End  Try
        Конец  Sub
    Конец  класса

    класс))

    Ответы: (52)
  52. лан, On Error Resume Next вроде работает. обработку исключения пока оставлю..

  53. (50) чё-то у тебя переводчик чудит

  54. (0) FINDSTR

  55. готовый код, удаляет кеш базы

    BaseName = "BaseName"
    
    set WshShell = WScript.CreateObject("WScript.Shell") 
    ' Получаем файл со списком баз
    set f=Fso1.OpenTextFile(WshShell.ExpandEnvironmentStrings("%USERPROFILE%") +"\Application Data\1C\1CEStart\ibases.v8i", 1, 0,fformat) 
    ' Считываем его построчно
    Do While f.AtEndOfStream<>True 
    Ll = f.ReadLine() 
    NumSML = Instr(Ll ,BaseName)
    if NumSML <> 0 then
    ' запоминаем ИД базы
    ID = Replace(f.ReadLine(), "ID=","" )
    ' Получаем полный путь до папки с кешем
    FF = WshShell.ExpandEnvironmentStrings("%USERPROFILE%") +"\Local Settings\Application Data\1C\1Cv82"+"/"+ID
    If  Fso1.FolderExists(FF) Then
    ' не выводим ошибку, если папку удалить не получается
    On Error Resume Next 
    ' удаляем папку
    Fso1.DeleteFolder(FF)
    end if
    end if
    Loop
    Ответы: (55)
  56. (54) от тебе делать нечего ... Есть же готовые CMD ...

    Ответы: (57)
  57. Процедура ОчиститьКэшИПерезапуститьПрограмму() Экспорт
    
         СкриптФайл = Новый ТекстовыйДокумент;
    
         СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
         СтрокаЗапускаПрограммы = КаталогПрограммы();
    
         ПутьКФайлуСкрипта = КаталогВременныхФайлов() + "CacheCleaning.vbs";
         ПутьКФайлу1С = СтрокаЗапускаПрограммы + "1cv8.exe";
    
         ИмяСервера = "";
         ИмяБазы = "";
         Путь = "";
         КомандаЗапуска = "";
         Один = """";
         Два = """""";
         Три = """""""";  
        Если (Найти(СтрокаСоединенияСБД, "File=") <> 0) Тогда
              Путь = СтрЗаменить(СтрокаСоединенияСБД, "File=", "");
              Путь = Лев(Путь, СтрДлина(Путь)-1);
              КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /F" + Путь + Один + ", 1, true";
         Иначе
              МассивПараметровСоединения = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(), ";");
              МассивПараметровСервера = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[0], """");
              ИмяСервера = СокрЛП(МассивПараметровСервера[1]);
              МассивПараметровБазы = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[1], """");
              ИмяБазы = СокрЛП(МассивПараметровБазы[1]);
              КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /S" + ИмяСервера + "\" + ИмяБазы + Один + ", 1, true";
         КонецЕсли;
         // Если пользователь не хочет перезапускать сеанс 1С, то после выполнения скрипта ничего не делаем. 
         Если Не глЗначениеПеременной("глПерезапускатьСеансРаботыСПрограммой")  Тогда
              КомандаЗапуска = ""; 
         КонецЕсли; 
    
         СкриптФайл.УстановитьТекст("WScript.Sleep(5000)
         |
         |Dim FSO 
         |Set FSO = WScript.CreateObject(""Scripting.FileSystemObject"")
         |Set WshShell = WScript.CreateObject(""WScript.Shell"")
         |Set colEnvVars = WshShell.Environment(""Process"")
         |
         |strComputer = ""."" 
         |Set objWMIService = GetObject(""winmgmts:"" _ 
         |& ""{impersonationLevel=impersonate}!\\"" _ 
         |& strComputer & ""\root\cimv2"") 
         |
         |Set colProcesses = objWMIService.ExecQuery( _ 
         |""select * From Win32_Process "" _ 
         |& ""Where Name = '1cv8.exe'"") 
         |
         |For Each objProcess In colProcesses 
         | objProcess.Terminate 
         |Next
         | 
         |WScript.Sleep(1000)
         | 
         |FolderName1 = ""\Local Settings\Application Data\1C\1Cv82""
         |FolderName2 = ""\Local Settings\Application Data\1C\1Cv81""
         |FolderName3 = ""\appdata\Local\1C\1Cv82""
         |FolderName4 = ""\appdata\Local\1C\1Cv81""
         | 
         |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName1) Then
         | GoSubFolders colEnvVars(""userprofile"") & FolderName1
         |End If
         |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName2) Then
         |GoSubFolders colEnvVars(""userprofile"") & FolderName2
         | End If
         |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName3) Then
         | GoSubFolders colEnvVars(""userprofile"") & FolderName3
         |End If
         |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName4) Then
         | GoSubFolders colEnvVars(""userprofile"") & FolderName4
         |End If
         |
         |" + КомандаЗапуска + "
         |Set WshShell = Nothing
         | 
         |Sub DelFile(sFILE)
         | On Error Resume Next
         | FSO.DeleteFile sFILE, True
         | If Err.Number <> 0 Then
         | Wscript.Echo ""Error deleting file: "" & sFILE
         | End If
         |End sub
         | 
         |Function GetFolder(sFOLDER)
         | On Error Resume Next
         | Set GetFolder = FSO.GetFolder(sFOLDER)
         | If Err.Number <> 0 Then
         | Wscript.Echo ""Error connecting to folder:"" & sFOLDER & VBlf & ""["" & Err.Number & ""]"" & Err.Description
         | Wscript.Quit Err.Number
         | End If
         |End Function
         | 
         |Sub GoSubFolders (objDIR)
         | ProcessFilesInFolder objDIR
         | Set sFolder = GetFolder(objDIR)
         | For Each eFolder in sFolder.SubFolders
         | GoSubFolders eFolder
         | Next
         | FSO.DeleteFolder sFolder, True
         |End Sub
         |
         |Sub ProcessFilesInFolder (objDIR)
         |Set sFolder = GetFolder(objDIR)
         |For Each objFile in sFolder.Files
         | DelFile objFile
         |Next
         |End Sub");
    
         Попытка
                СкриптФайл.Записать(ПутьКФайлуСкрипта, КодировкаТекста.Системная);
                ЗапуститьПриложение(ПутьКФайлуСкрипта);
         Исключение
         КонецПопытки;
    
    КонецПроцедуры   
    
  58. (55) мне нужно не весь кеш чистить, а конкретной базы. таких готовых скриптов я не нашел.
    и нужно встроить этот кусок в скрипт обновления баз.

    причина банальна - места на системном диске мало и когда обновляется 100500 баз друг за другом несколькими скриптами темпы забивают место моментально. а тут - после каждой базы аккуратно чистится кеш за ней

  59. Если мне не изменяет склероз, можно писать On Error Resume [метка], а на той метке делать обработку ошибки.

  60. http://infostart.ru/public/192092/
    http://infostart.ru/public/184645/
    http://infostart.ru/public/172791/
    http://infostart.ru/public/270058/ - с выбором нужных баз

    Ответы: (60) (61)
  61. (59) Вот и я про это ... Писать сейчас код разве что для разминки ума ...

  62. (59) хорошие обработки ни разу не предназначенные для автоматического удаления кеша на vbs
    каждой обработке нужен пользователь, который её запускает.

    Ответы: (64)
  63. + особенно на C#, ага. потратить неделю, чтобы перевести с C# на vbs

  64. + для тупого одинесника, который не умеет писать по английски, эта миссия невыполнима

  65. (61) а в чём принципиально отличие представленных скриптов и твоего скрипта?

    Ответы: (65)
  66. (64) не знаю, не качал. знаю только, что разбираться в чужом коде(английском!!) и переделывать его дольше, чем писать собственный

    Ответы: (66) (67)
  67. (65) школа Дуба

  68. (65) Так есть же базовые мануалы? И мастера есть матерые, учить не будут, так посоветуют, что читать. Все дело в источнике дохода.

  69. псс, парень, не хочешь еще немного vbs?

    вот код, который обрывает соединения:

    Set connector = CreateObject("V82.COMConnector")
    		Set AgentConnection = Connector.ConnectAgent(ServerName & ":1640")
    		Set Cluster = AgentConnection.GetClusters()(0)
    		AgentConnection.Authenticate Cluster, "", ""
    		WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster)
    	
    		For Each WorkingProcess In WorkingProcesses
    	
    			ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
    			Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
    			WorkingProcessConnection.AddAuthentication "", ""
    			Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
    			ibDesc.Name = BaseName
    			Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
    			[b]ibDesc.PermissionCode = "123"
    			ibDesc.SessionsDenied =True[/b]
    
    
    			For Each Connection In Connections
    	       			If (Connection.AppID <> "COMConsole") Then
    	       				txtStreamOut.WriteLine "                    > Имя компьютера " & Connection.HostName & ", пользователь " & Connection.UserName	
    						WorkingProcessConnection.Disconnect Connection
    						txtStreamOut.WriteLine "                    > Соединение разорвано."
    		       		Else
    		           		Set ConnectionCOMConsole = Connection
    		        	End If
    			Next
            	
            	WorkingProcessConnection.Disconnect ConnectionCOMConsole
    	
    		Next

    выделил жирным то, что вроде бы должно ставить блокировку соединений. но оно не ставит.

    как поставить блокировку соединений средствами VBS??

  70. а нифига жирным не выделяется. косяк

  71. Stim а нифига жирным не выделяется

    и не должно

  72. код:

    Set connector = CreateObject("V82.COMConnector")
    		Set AgentConnection = Connector.ConnectAgent(ServerName & ":1640")
    		Set Cluster = AgentConnection.GetClusters()(0)
    		AgentConnection.Authenticate Cluster, "", ""
    		WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster)
    	
    		
    		InfoBases  = WorkingProcessConnection.GetInfoBases()
    
    			WorkingProcessConnection.AddAuthentication "", ""
    
    			For Each InfoBase In InfoBases
    				' Ищем нужную базу
    				If UCase(InfoBase.Name) = UCase(BaseName) Then
    					' Устанавливаем запрет на подключение новых соединений
    					InfoBase.ConnectDenied = True
    					InfoBase.DeniedFrom = CStr(Now())
    					dateFinish = Now() + 1/24
    					InfoBase.DeniedTo = CStr(dateFinish)
    					InfoBase.DeniedMessage = "Выполняется обновление информационной базы. Установлена блокировка соединений до "+CStr(dateFinish) 
    					InfoBase.PermissionCode = "111"
    					WorkingProcessConnection.UpdateInfoBase (InfoBase)
    
    				End If
    					Next
    

или зарегистрируйтесь чтобы ответить!