|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем |
|
VBS/WSH/JS - [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем
|
Новый участник Сообщения: 2 |
Всем привет, не смог считать значение ячейки в файле xls через bat файл и залез в неведомые дебри vbs .Извините заранее если вопросы получились глупыми или неуместными
Логическая структура у меня получилась такая цикл перебора всех файлов xls в определенной папке: для каждого файла: -открыть ,считать содержимое ячейки (например R4C36) и записать в переменную1 -открыть из папки txt файл с именем переменной1 -записать содержимое txt (1 строку в переменную2 ,2 строку в переменную3) -запустить архиватор где пароль переменная2 ,имя файла переменная3) Далее сам код ,помимо ошибок в синтаксисе не смог разобраться вот в таких моментах 1) При переборе через For Each oFile In oFSO.GetFolder(sFolder).Files , oFile является ли переменной которая содержит имя файла ? 2) Если да,то как использовать значение oFile в пути открытии книги? Workbooks.Open "C:\???.xls" ' 3) Если нет,то как передать имя найденного файла в текущем цикле в переменную? 4) какой правильный синтаксис указания переменной в пути? & CStr(переменная) верно ли? "U:\ZP\zip\& CStr(переменная) &.zip" 5) Действительно ли этим var oWshShell = new ActiveXObject("WScript.Shell") можно запустить exe файл с параметрами? Dim sFolder sFolder = "U:\ZP\xls\" Set oFSO = CreateObject("Scripting.FileSystemObject") For Each oFile In oFSO.GetFolder(sFolder).Files If UCase(oFSO.GetExtensionName(oFile.Name)) = "xls" Then ProcessFiles oFSO, oFile End if Next Set oFSO = Nothing Sub ProcessFiles(FSO, File) dim excel UserForm_Initialize() Workbooks.Open "C:\.xls" ' как вставить содержимое ofile в путь к файлу? Workbooks(1).Worksheets(1).Cells(13, 1).Value = excel Option Explicit Dim strFileName Dim arrContent Dim pass, mail strFileName = "& CStr(excel) &.txt" With WScript.CreateObject("Scripting.FileSystemObject") If .FileExists(strFileName) Then With .OpenTextFile(strFileName) arrContent = Split(.ReadAll(), vbCrLf) .Close End With If UBound(arrContent) >=1 Then pass = arrContent(0) mail = arrContent(1) WScript.Echo anyValueA, anyValueB Else WScript.Echo "Not enough lines [" & CStr(UBound(arrContent) + 1) & "] in [" & strFileName & "]" End If Else WScript.Echo "Can't find file [" & strFileName & "]" End If End With WScript.Quit var oWshShell = new ActiveXObject("WScript.Shell"); oWshShell.Run("\"C:\Program Files\7-Zip\7z.exe" a -tzip -p& CStr(pass) & "U:\ZP\zip\& CStr(mail) &.zip" >> U:\ZP\log\log_zip.txt ); 'удастся ли вставить переменные в этой конструкции? end sub |
|
Отправлено: 12:56, 12-07-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать fawor1t, не хватает малости — упаковать в архив примеры файлов .xls и .txt, и приложить его к сообщению. Их содержимое важно для понимания работы кода и его отладки.
Цитата fawor1t:
Скрытый текст
Option Explicit Dim objFSO Dim objFolder Dim objFile Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") WScript.Echo TypeName(objFSO) Set objFolder = objFSO.GetFolder("c:\") WScript.Echo TypeName(objFolder) WScript.Echo TypeName(objFolder.Files) For Each objFile In objFolder.Files WScript.Echo TypeName(objFile) Exit For Next Set objFSO = Nothing WScript.Quit 0 Кроме того, в VB/VBScript/VBA есть две особенности — неявное преобразование типов и использование свойства по умолчанию. У класса File свойством по умолчанию является свойство .Path (можно посмотреть любым браузером объектов: WSH: браузеры объектов автоматизации (OLE/COM/Automation) — Серый форум). Посему две выделенные строки в таком коде: With WScript.CreateObject("Scripting.FileSystemObject") WScript.Echo .GetFile("C:\Windows\System32\notepad.exe").Path WScript.Echo .GetFile("C:\Windows\System32\notepad.exe") End With Ответ на вопрос — переменная oFile содержит объект типа File. Цитата fawor1t:
Цитата fawor1t:
CStr() нужна только для преобразования значения переменной в строковое представление в случае потребности. Цитата fawor1t:
|
||||
Отправлено: 14:05, 12-07-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать fawor1t,
При наличии отсутствия Вашей реакции на вопросы, в первом приближении вариант скрипта
ExtIn = "xls" 'Расширение Excel-файла RangeIn = "C4" 'Адрес клетки, где хранится имя текстового файла с паролем и именем файла для архивации BoxIn = "Z:\Box_In" ' Папка с Excel-файлами BoxTxt = "Z:\Box_In" ' Папка с текстовыми файлами в Windows кодировке 1251 BoxFrom = "Z:\Soft_In" ' Папка с файлами, которые надо упаковать BoxArc = "Z:\Soft_Arc" ' Папка с упакованными файлами TimeErr = 20 ' Время отображения сообщения об ошибке Arc = """C:\Program Files\7-Zip\7zG.exe"" a -tzip -p" Set FSO = CreateObject("Scripting.FileSystemObject") Set WShell = CreateObject("WScript.Shell") On Error Resume Next Set InBox = FSO.GetFolder(BoxIn) If Err.Number <> 0 Then LL = WShell.Popup("Папка" + vbCrLf + vbCrLf + BoxIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, 0, "Открытие папки", 16) On Error GoTo 0 Else Set XL = CreateObject("Excel.Application") ' XL.Visible = True XL.Visible = False On Error GoTo 0 Set AllFiles = InBox.Files For Each File In AllFiles XlsName = BoxIn + "\" + File.Name If LCase(FSO.GetExtensionName(XlsName)) = LCase(ExtIn) Then Set XLbook = XL.Workbooks.Open(XlsName) TxtName = BoxTxt + "\" + CStr(XL.Range(RangeIn).Value) XLbook.Close On Error Resume Next Set iTxt = FSO.OpenTextFile(TxtName, 1) If Err.Number <> 0 Then LL = WShell.Popup(XlsName + vbCrLf + vbCrLf + "Файл" + vbCrLf + TxtName + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, TimeErr, "Открытие файла", 48) Else Pass = Trim(iTxt.ReadLine) If iTxt.AtEndOfLine Then LL = WShell.Popup(XlsName + vbCrLf + vbCrLf + "В файле" + vbCrLf + TxtName + vbCrLf + vbCrLf + "Не хватает данных", TimeErr, "Ошибка", 48) Else ForArcFile = Trim(iTxt.ReadLine) If FSO.FileExists(BoxFrom + "\" + ForArcFile) Then LL = WShell.Run(Arc + Pass + " """ + BoxArc + "\" + ForArcFile + ".zip"" """ + BoxFrom + "\" + ForArcFile + """", 1, True) Else LL = WShell.Popup(XlsName + vbCrLf + TxtName + vbCrLf + vbCrLf + "Нет файла" + vbCrLf + BoxFrom + "\" + ForArcFile, TimeErr, "Ошибка", 48) End If End If iTxt.Close End If On Error GoTo 0 End If Next XL.Quit End If |
------- Последний раз редактировалось megaloman, 12-07-2017 в 21:11. Причина: Учёл замечание Iska+добавил проверку на существование файла для архивации Отправлено: 17:48, 12-07-2017 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 18:00, 12-07-2017 | #4 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Привет всем еще раз,увы вчера не смог зайти на форум ,но в итоге решил задачу сам. Разве что пароли из хранения в файлах перенес в файл эксель . Спасибо за ответы благодаря им познакомлюс с vba поближе)
Dim sFolder Dim Ofile Sub Workbook_Open() sFolder = "С:\01\xls\" Set oFSO = CreateObject("Scripting.FileSystemObject") For Each Ofile In oFSO.GetFolder(sFolder).Files If UCase(oFSO.GetExtensionName(Ofile.Name)) = "XLS" Then ProcessFiles oFSO, Ofile End If Next Set oFSO = Nothing End Sub Sub ProcessFiles(FSO, File) Dim excel Workbooks.Open Filename:=Ofile excel = ActiveCell.Cells(11, 1).Value ActiveWorkbook.Close Windows("start.xlsm").Activate Sheets("Пароли").Select a = Range("A1:B10").Find(excel).Row b = Range("A1:B10").Find(excel).Column pass = Sheets("Пароли").Cells(a, b + 1).Value mail = Sheets("Пароли").Cells(a, b + 2).Value FolderName = "С:\01\zip\" PathZipProgram = "C:\Program Files\7-Zip\" smail = FolderName + mail + ".zip" ShellStr = PathZipProgram & "7z.exe a -tzip -p" & pass & "" & " " & smail & " " & Ofile & "" Shell ShellStr End Sub |
|
Отправлено: 13:46, 13-07-2017 | #5 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Создание TXT файла для каждого файла в каталоге ISO и заполнение его по шаблону | onemal | Скриптовые языки администрирования Windows | 23 | 13-05-2017 15:35 | |
Любой язык - [решено] Перебор жетских дисков в системе, запуск утилиты для каждого из них | totopolis | Скриптовые языки администрирования Windows | 5 | 21-09-2016 20:41 | |
VBS/WSH/JS - Удалить в папке файлы с одинаковым название но разным расширением | 929151 | Скриптовые языки администрирования Windows | 3 | 29-01-2016 13:54 | |
PowerShell - [решено] Поочередный выбор каждого файла в папке | Junos | Скриптовые языки администрирования Windows | 1 | 03-07-2014 08:01 | |
Доступ - Доступ к сетевой папке с разных ПК с паролем | muradasilov | Microsoft Windows 2000/XP | 3 | 05-02-2013 15:24 |
|