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

Показать сообщение отдельно

Ветеран


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

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


Цитата jordan_74:
Я не знаю) »
У нас примерно три варианта для задания пути к исходному файлу, которое должно постоянно меняться:

1. Тупо указать в коде. Это был наш первый вариант (и наихудший).

2. Указать аргументом скрипта. Это наш второй вариант (и наиболее предпочтительный). Вы, например, можете просто перетаскивать исходный файл реестра на скрипт, я — могу быстро и удобно, посредством всего нескольких нажатий клавиш, указывать путь к исходному файлу реестра в командной строке Far Manager'а:
Скрытый текст

кто-то напишет пакетный файл, в котором будут перебираться только заданные файлы реестра:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив1\1.xlsx" "C:\Мои проекты\0191\Архив1\2.xlsx" "C:\Мои проекты\0191\Архив2\bla-bla-bla.xlsx") do (
	echo [%%~i]
	cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

или все подряд файлы реестра в каталоге, наподобие:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
	echo [%%~i]
	cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

И всё это будет работать.

3. Хранить путь в каком-либо заранее предопределённом и обговоренном месте. Например, использовать какой-нибудь файл конфигурации с предопределённым именем и местоположением, в котором указывать путь к исходному файлу (откуда он будет считываться скриптом). Или какой-нибудь предопределённый параметр в реестре. Столь же неудобно и малоосмысленно, как и прямое указание пути непосредственно в коде.

Цитата jordan_74:
с VBA я ещё как то знаком, а вот с wsh совершенно нет. »
Они весьма похожи.

Цитата jordan_74:
прокомментировать блоки кода »
Примерно так:
Скрытый текст
Код: Выделить весь код
Option Explicit

' Константы из библиотеки Microsoft Excel
'
' В процедурах VBA под Microsoft Excel они предопределены, поскольку там 
' подключены в ссылках соответствующие библиотеки,
' а для VBScript/JScript таковой механизм отсутствует (но не в целом для WSH 
' — в пакетах заданий .wsf можно указывать ссылки на библиотеки), и константы приходится 
' описывать непосредственно в коде «ручками»
Const xlCSV = 6
Const xlWindows = 2

Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


' Путь к файлу шаблона
strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
' Путь к целевому каталогу
strDestFolder   = "C:\Мои проекты\0191\Архив\Архив\Итог"

' Если число переданных скрипту аргументов равно единице…
If WScript.Arguments.Count = 1 Then
	' …зададим переменной значение первого аргумента
	strSourceFile = WScript.Arguments.Item(0)
	
	' Создаём экземпляр объекта класса "Scripting.FileSystemObject"
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	' Если файл шаблона существует…
	If objFSO.FileExists(strTemplateFile) Then
		' Если файл, указанный первым аргументом скрипта, существует…
		If objFSO.FileExists(strSourceFile) Then
			' Если целевой каталог существует…
			If objFSO.FolderExists(strDestFolder) Then
				' Создаём экземпляр объекта класса "Excel.Application"
				Set objExcel = WScript.CreateObject("Excel.Application")
				
				' Открываем файл шаблона как текст в виде Рабочей книги
				objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
				' Создаём ссылку на эту объект открытой Рабочую книгу — в данный момент она у нас всегда будет одна
				Set objTemplateFile = objExcel.Workbooks.Item(1)
				
				' Открываем исходный файл реестра и сохраняем ссылку на объект Рабочей книги
				Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)
				
				' Пробегаемся циклом от 1 до (число строк использованного диапазона Рабочей книги 
				' исходного файла реестра за вычетом двух строк — заголовка и суммы)
				For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
					With objTemplateFile.Worksheets.Item(1)
						' Получили значение из ячейки (i + 1, 5) исходного файла реестра 
						anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
						
						' Задали это полученное значение двум диапазонам Рабочей книги файла шаблона
						' — нашего будущего целевого файла
						.Range("B3").Value = anyValue
						.Range("F2").Value = anyValue
						
						' Получили значение из ячейки (i + 1, 6) исходного файла реестра 
						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 = Round((anyValue * 18) / 118, 1)
					End With
					
					' Создали полное имя для нашего будущего целевого файла
					strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))
					
					' Если целевой файл уже существует в целевом каталоге…
					If objFSO.FileExists(strDestFile) Then
						' …удаляем его
						objFSO.DeleteFile strDestFile, True
					End If
					
					' Сохраняем открытую Рабочую книгу шаблона под именем нашего целевого файла
					' в формате CSV
					objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
				Next
				
				' Закрываем открытые Рабочие книги
				objSourceFile.Close False
				objTemplateFile.Close False
				
				' Завершаем работу приложения Microsoft Excel и очищаем ссылку на экземпляр объекта
				objExcel.Quit
				Set objExcel = Nothing
			Else
				WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
				WScript.Quit 4
			End If
		Else
			WScript.Echo "Can't find source file [" & strSourceFile & "]."
			WScript.Quit 3
		End If
	Else
		WScript.Echo "Can't find template file [" & strTemplateFile & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
	WScript.Quit 1
End If

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:57, 05-09-2018 | #21