Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем

Ответить
Настройки темы
VBS/WSH/JS - [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет, не смог считать значение ячейки в файле 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


fawor1t, не хватает малости — упаковать в архив примеры файлов .xls и .txt, и приложить его к сообщению. Их содержимое важно для понимания работы кода и его отладки.

Цитата fawor1t:
1) При переборе через For Each oFile In oFSO.GetFolder(sFolder).Files , oFile является ли переменной которая содержит имя файла ? »
Свойство .Files класса Folder возвращает коллекцию объектов типа File:
Скрытый текст
Код: Выделить весь код
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
Цитата:
Код: Выделить весь код
C:\Мои проекты\0098>0003.vbs
FileSystemObject
Folder
Files
File

Кроме того, в 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:
2) Если да,то как использовать значение oFile в пути открытии книги? Workbooks.Open "C:\???.xls" ' »
Код: Выделить весь код
Workbooks.Open oFile.Path
но код надо править: следует запоминать ссылку на открытую методом .Open() Рабочую книгу и работать именно с ней, а не играться в игры с Workbooks(1).

Цитата fawor1t:
4) какой правильный синтаксис указания переменной в пути? & CStr(переменная) верно ли? "U:\ZP\zip\& CStr(переменная) &.zip" »
Смотря что за переменная. Общий принцип:
Код: Выделить весь код
"U:\ZP\zip\" & Переменная & ".zip"
CStr() нужна только для преобразования значения переменной в строковое представление в случае потребности.

Цитата fawor1t:
5) Действительно ли этим var oWshShell = new ActiveXObject("WScript.Shell") можно запустить exe файл с параметрами? »
Можно. Но Вы взяли синтаксис из JScript. Это другой язык.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:05, 12-07-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


megaloman, повторюсь, лучше использовать возвращаемую ссылку, т.е., не:
Код: Выделить весь код
XL.Workbooks.Open XlsName
…
XL.ActiveWorkbook.Close
…
а:
Код: Выделить весь код
Set objWorkbook = XL.Workbooks.Open(XlsName)objWorkbook.Close
…
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:00, 12-07-2017 | #4


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход