|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Создание папки в определенном каталоге |
|
VBS/WSH/JS - Создание папки в определенном каталоге
|
Пользователь Сообщения: 60 |
Профиль | Отправить PM | Цитировать
Всем добрый вечер! Нужна ваша помощь, о просветленные программисты)
Есть скрипт на vbs. В нем автоматически создается папка Архив. В этот архив должны складываться папки с текущей датой в имени(этого я добился) Вопрос, как эту самую(е) папки создавать в папке Архив? Почему то создается в корне C:\Реестр\ Привожу кусок кода Скрытый текст
Dim s,d,m,y Dim strArciveFolder strArciveFolder = "C:\Реестр\Архив" 'Создание папки Архив: Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Not objFSO.FolderExists(strArciveFolder) Then objFSO.CreateFolder strArciveFolder End If ' Создание подпапки с системной датой в ее названии в каталоге Архив Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") On Error Resume Next d = day( date() ) m = month(date()) y = year(date()) if d < 10 then d = "0" & d end if if m < 10 then m = "0" & m end if s = y & "_" & m & "_" & d Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CreateFolder (s) В перспективе в эту папку с текущей датой в имени будут копироваться архивные файлы. Буду очень признателен за помощь! |
|
Отправлено: 22:57, 28-11-2018 |
Ушел из жизни Сообщения: 8595
|
Профиль | Сайт | Отправить PM | Цитировать jordan_74, а почему вы определяете objFSO не перед первым использованием, а в конце скрипта?
|
------- Отправлено: 23:21, 28-11-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Цитата mwz:
|
|
Отправлено: 23:26, 28-11-2018 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата jordan_74:
Цитата jordan_74:
Скрытый текст
Я бы изобразил нечто подобное: Option Explicit Dim strRootFolder Dim strArchiveFolder Dim objFSO Dim objRootFolder Dim objArchiveFolder Dim strPath2ArchiveFolder Dim objSWbemObjectEx Dim objNowFolder strRootFolder = "C:\Реестр" strArchiveFolder = "Архив" Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If objFSO.FolderExists(strRootFolder) Then Set objRootFolder = objFSO.GetFolder(strRootFolder) strPath2ArchiveFolder = objFSO.BuildPath(strRootFolder, strArchiveFolder) If Not objFSO.FolderExists(strPath2ArchiveFolder) Then Set objArchiveFolder = objRootFolder.SubFolders.Add(strArchiveFolder) Else Set objArchiveFolder = objFSO.GetFolder(strPath2ArchiveFolder) End If For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT LocalDateTime FROM Win32_OperatingSystem") Set objNowFolder = objArchiveFolder.SubFolders.Add(Left(objSWbemObjectEx.LocalDateTime, 8)) Exit For Next '... '... '... Set objNowFolder = Nothing Set objArchiveFolder = Nothing Set objRootFolder = Nothing Else WScript.Echo "Can't find root folder [" & strRootFolder & "]." WScript.Quit 1 End If Set objFSO = Nothing WScript.Quit 0 |
||
Отправлено: 05:53, 29-11-2018 | #4 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Iska,
Попытался встроить данный кусок в код. Сработало, папка с текущей датой в имени создалась в папке Архив. Но сама папка Архив создалась не в том месте, почему то... она создалась в папке Итог - C:\Реестр\Итог\Архив\20181129, а верный вариант C:\Реестр\Архив\20181129 Просьба подсказать где ошибка.. Скрытый текст
Option Explicit Const xlCSV = 6 Const xlWindows = 2 Dim s,d,m,y Dim Log 'Лог-файл Dim strSourceFolder ' Папка Реестр Dim strTemplateFile ' Файл шаблона Dim strRelativeDestFolder ' Папка "Итог" Dim strRootFolder ' Папка C:\Реестр Dim strArchiveFolder ' Папка архив Dim objRootFolder Dim objArchiveFolder Dim strPath2ArchiveFolder Dim objSWbemObjectEx Dim objNowFolder Dim strLogDestFolder 'Папка, в которой будут создаваться лог-файлы Dim objFSO Dim objExcel Dim objFile Dim objTemplateFile Dim objSourceFile Dim i Dim strDestFile Dim strLogDestFile Dim SumSourceFile 'Сумма по реестру Dim SumDestFile 'Сумма по чекам Dim SumTotal 'Общая сумма Dim CountSourceFiles 'Для подсчета файлов реестра CountSourceFiles = 0 Dim anyValue 'Здесь указать полный адрес папки с файлами реестра: strSourceFolder = "C:\Реестр\реестр" strTemplateFile = "C:\Реестр\Шаблон\check.csv" strRelativeDestFolder = "..\Итог" strLogDestFolder = "C:\Касса" strArchiveFolder = "Архив" strRootFolder = "C:\Реестр" 'If WScript.Arguments.Count = 1 Then ' strSourceFolder = WScript.Arguments.Item(0) Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Если файл шаблона существует If objFSO.FileExists(strTemplateFile) Then ' Если папка "реестр" существует If objFSO.FolderExists(strSourceFolder) Then strRootFolder = objFSO.GetAbsolutePathName(objFSO.BuildPath(strSourceFolder, strRelativeDestFolder)) If Not objFSO.FolderExists(strRootFolder) Then objFSO.CreateFolder strRootFolder End If 'Создание папки Касса: If Not objFSO.FolderExists(strLogDestFolder) Then objFSO.CreateFolder strLogDestFolder End If 'Создание папки Архив: Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If objFSO.FolderExists(strRootFolder) Then Set objRootFolder = objFSO.GetFolder(strRootFolder) strPath2ArchiveFolder = objFSO.BuildPath(strRootFolder, strArchiveFolder) If Not objFSO.FolderExists(strPath2ArchiveFolder) Then Set objArchiveFolder = objRootFolder.SubFolders.Add(strArchiveFolder) Else Set objArchiveFolder = objFSO.GetFolder(strPath2ArchiveFolder) End If For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT LocalDateTime FROM Win32_OperatingSystem") Set objNowFolder = objArchiveFolder.SubFolders.Add(Left(objSWbemObjectEx.LocalDateTime, 8)) Exit For Next Set objNowFolder = Nothing Set objArchiveFolder = Nothing Set objRootFolder = Nothing Else WScript.Echo "Can't find root folder [" & strRootFolder & "]." WScript.Quit 3 End If Set objExcel = Nothing For Each objFile In objFSO.GetFolder(strSourceFolder).Files 'Подсчет количества файлов реестра: CountSourceFiles = CountSourceFiles + 1 Select Case LCase(objFSO.GetExtensionName(objFile.Name)) Case "xls", "xlsx" If objExcel Is Nothing Then Set objExcel = WScript.CreateObject("Excel.Application") End If objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True Set objTemplateFile = objExcel.Workbooks.Item(1) Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True) For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2 With objTemplateFile.Worksheets.Item(1) anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value .Range("B3").Value = anyValue .Range("F2").Value = anyValue anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value .Range("D3").Value = anyValue .Range("D4").Value = anyValue .Range("H3").Value = anyValue 'Подсчет НДС .Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100 'Подсчет общей суммы: SumTotal = SumTotal + anyValue 'Подсчет суммы по реестру: SumSourceFile = SumSourceFile + anyValue 'Подсчет суммы по чекам: SumDestFile = SumDestFile + .Range("H3").Value End With ' Создаем имя файла strDestFile = objFSO.BuildPath(strRootFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(objFile.Name) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile)) If objFSO.FileExists(strDestFile) Then objFSO.DeleteFile strDestFile, True End If objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True Next 'В strLogDestFile записывается где будет создан лог-файл и как он будет называться: strLogDestFile = objFSO.BuildPath(strLogDestFolder, Day(now) & "_" & Month(now) & "_" & Year(now) & ".txt") 'Открытие лог-файла или создание, если его нет: Set Log = objFSO.OpenTextFile(strLogDestFile, 8, True) 'Запись данных в лог-файл: Log.Write FormatDateTime(now, 0) 'В лог записывается дата и время обработки файлов Log.Write ". Обработан файл " & objFSO.GetBaseName(objFile.Name) & "." & objFSO.GetExtensionName(objFile.Name) Log.Write ". Строк обработано: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2) Log.Write ". Чеков создано: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2) Log.Write ". Сумма по реестру: " & SumSourceFile Log.Write ". Сумма по чекам: " & SumDestFile 'Сравнение сумм по реестру и чекам - если они равны, то это записывается в лог If SumSourceFile = SumDestFile Then Log.Write ". Суммы равны." End If Log.WriteBlankLines(1) Log.Close 'Обнуление сумм, чтобы для каждого файла реестра и его чеков считалась своя отдельная сумма SumSourceFile = 0 SumDestFile = 0 objSourceFile.Close False objTemplateFile.Close False End Select Next If Not objExcel Is Nothing Then objExcel.Quit Set objExcel = Nothing 'Копируем файлы из папки "Итог" в папку "Архив" ' Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") ' objFSO.CopyFile "C:\Реестр\Итог\*.*" , "C:\Реестр\Архив\" 'Выводит окно о завершении обработки файлов: WScript.Echo "Чеки сформированы успешно. Обработано " & CountSourceFiles & " реестра на сумму " & SumTotal & ". Подробности на C:\касса" Else WScript.Echo "Can't find source folder [" & strSourceFolder & "]." WScript.Quit 2 End If Set objFSO = Nothing Else WScript.Echo "Can't find template file [" & strTemplateFile & "]." WScript.Quit 1 End If 'Else ' WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>" ' WScript.Quit 1 End if WScript.Quit 0 |
|
Отправлено: 13:32, 29-11-2018 | #5 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать jordan_74, Я подробно не разбирался в Вашем коде, понял, что Вы создаёте несколько папок. Потом запутываетесь в путях.
Зачем-то многократно определяете Set objFSO ... Предлагаю создание папки выделить в отдельную процедуру, при этом при вызове указывать её полный путь
Вот пример применения функции, которая при необходимости создаст все папки в указанном пути, даже если папка более высокого уровня пока не существует
Option Explicit Dim strRootFolder Dim objFSO Dim strSourceFolder Dim strRelativeDestFolder Dim intOut Dim strFolderDate strRootFolder = "C:\Реестр" strSourceFolder = "C:\Реестр\реестр" strRelativeDestFolder = "C:\Реестр\Итог" strFolderDate = "C:\Реестр" + "\" + CStr(Year(Date)) + Right(CStr(Month(Date) + 100), 2) + Right(CStr(Day(Date) + 100), 2) Set objFSO = CreateObject("Scripting.FileSystemObject") intOut = MakeFold(objFSO, strFolderDate) intOut = MakeFold(objFSO, strSourceFolder) intOut = MakeFold(objFSO, strRelativeDestFolder) intOut = MakeFold(objFSO, strRootFolder) '---------------------------------------------- Function MakeFold(objFSO, strPathFolder) If objFSO.FolderExists(strPathFolder) Then MakeFold = 0 Exit Function End If Dim arrPath Dim strPath Dim iPath arrPath = Split(strPathFolder, "\") strPath = "" MakeFold = 1 On Error Resume Next For Each iPath In arrPath strPath = strPath + iPath + "\" If Not objFSO.FolderExists(strPath) Then objFSO.CreateFolder strPath If Err.Number <> 0 Then MsgBox strPath + vbCrLf + vbCrLf + "Error= " + CStr(Err.Number) + vbCrLf + Err.Description MakeFold = 1 On Error GoTo 0 Exit Function End If MakeFold = 0 End If Next On Error GoTo 0 End Function Option Explicit Dim strRootFolder Dim objFSO Dim strSourceFolder Dim strRelativeDestFolder Dim intOut Dim strFolderDate strRootFolder = "C:\Реестр" strSourceFolder = "C:\Реестр\реестр" strRelativeDestFolder = "C:\Реестр\Итог" strFolderDate = "C:\Реестр" + "\" + CStr(Year(Date)) + Right(CStr(Month(Date) + 100), 2) + Right(CStr(Day(Date) + 100), 2) Set objFSO = CreateObject("Scripting.FileSystemObject") intOut = MakeFold(objFSO, strRootFolder) intOut = MakeFold(objFSO, strSourceFolder) intOut = MakeFold(objFSO, strRelativeDestFolder) intOut = MakeFold(objFSO, strFolderDate) '---------------------------------------------- Function MakeFold(objFSO, strPathFolder) MakeFold = 0 If Not objFSO.FolderExists(strPathFolder) Then On Error Resume Next objFSO.CreateFolder strPathFolder If Err.Number <> 0 Then MsgBox strPathFolder + vbCrLf + vbCrLf + "Error= " + CStr(Err.Number) + vbCrLf + Err.Description MakeFold = 1 End If On Error GoTo 0 End If End Function |
------- Отправлено: 20:06, 29-11-2018 | #6 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Iska, Добрый день! Спасибо за помощь, все получилось !
Хочу вот о чем спросить, с 2019 года НДС будет не 18 а 20 %. В текущем коде 18% и я понимаю, что нужно задействовать дату. При условии что в реестре дата (второй столбец) больше 31.12.2018 тогда формула расчета НДС будет следующая: .Range("L3").Value = Fix((anyValue * 20 / 120 + 0.005) * 100) / 100 Просьба помочь в оформлении условия. Вот текущий код Скрытый текст
Select Case LCase(objFSO.GetExtensionName(objFile.Name)) Case "xls", "xlsx" If objExcel Is Nothing Then Set objExcel = WScript.CreateObject("Excel.Application") End If objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True Set objTemplateFile = objExcel.Workbooks.Item(1) Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True) For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2 With objTemplateFile.Worksheets.Item(1) anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 4).Value .Range("B3").Value = anyValue .Range("F2").Value = anyValue anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value .Range("D3").Value = anyValue .Range("D4").Value = anyValue .Range("H3").Value = anyValue ' Подсчет НДС .Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100 'Подсчет общей суммы: SumTotal = SumTotal + anyValue 'Подсчет суммы по реестру: SumSourceFile = SumSourceFile + anyValue 'Подсчет суммы по чекам: SumDestFile = SumDestFile + .Range("H3").Value End With |
Отправлено: 11:38, 18-12-2018 | #7 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать После проб и ошибок получилось нечто следующее, вроде работает.
Скрытый текст
Select Case LCase(objFSO.GetExtensionName(objFile.Name)) Case "xls", "xlsx" If objExcel Is Nothing Then Set objExcel = WScript.CreateObject("Excel.Application") End If objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True Set objTemplateFile = objExcel.Workbooks.Item(1) Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True) For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2 With objTemplateFile.Worksheets.Item(1) anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 4).Value .Range("B3").Value = anyValue .Range("F2").Value = anyValue anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value .Range("D3").Value = anyValue .Range("D4").Value = anyValue .Range("H3").Value = anyValue ' Подсчет НДС DataPlatez = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 2).Value ' Если дата платежа в реестре меньше или равно 31.12.2018 If DataPlatez <= #31/12/2018# Then ' НДС расчитывается по ставке 18% .Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100 Else ' Иначе НДС расчитывается по ставке 20% .Range("L3").Value = Fix((anyValue * 20 / 120 + 0.005) * 100) / 100 End if 'Подсчет общей суммы: SumTotal = SumTotal + anyValue 'Подсчет суммы по реестру: SumSourceFile = SumSourceFile + anyValue 'Подсчет суммы по чекам: SumDestFile = SumDestFile + .Range("H3").Value End With |
Отправлено: 06:43, 19-12-2018 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Flash - Все папки в корневом каталоге создаются с атрибутом "только чтение" | pasha4ur | Накопители (SSD, HDD, USB Flash) | 9 | 14-12-2017 02:37 | |
CMD/BAT - [решено] Создание TXT файла для каждого файла в каталоге ISO и заполнение его по шаблону | onemal | Скриптовые языки администрирования Windows | 23 | 13-05-2017 15:35 | |
Любой язык - [решено] назначить нужные права на папки в каталоге | batyaPS | Скриптовые языки администрирования Windows | 25 | 14-09-2014 12:04 | |
CMD/BAT - Проверка файлов в сетевом каталоге, и создание списка из тех которые по размеру < N | wonted | Скриптовые языки администрирования Windows | 21 | 17-03-2014 13:40 | |
создание папки | Irvix | Программирование и базы данных | 1 | 31-10-2003 12:59 |
|