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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Excel

Ответить
Настройки темы
PowerShell - Excel

Пользователь


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

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


Вложения
Тип файла: zip XML-обработка 3-01.zip
(370.4 Kb, 2 просмотров)
Суть:
скрипт часть логов отписывает в ексель.
все отрабатывает корректно, но в диспетчере задач всегда висит один процесс EXCEL.EXE, который не уходит доже после закрытия скрипта.

Вопрос:
Каким образом корректно это исправить. напрягает

сам скрипт
Код: Выделить весь код
# Разрешаем выполнение скрипта
Set-ExecutionPolicy remotesigned

#-->Описываем все переменные блока
#	пути:
$PathPrefix = "D:\test"
#$PathPrefix = "\\serv\Otdely\ZUR\ГКН"	# повторяющийся элемент пути
$PathIn     = "$PathPrefix"				# каталог, откуда брать ZIP файлы
$PathOut    = "$PathPrefix"				# каталог, куда помещаем результат работы скрипта
$PathBase   = "$PathPrefix\base"		# каталог, где расположены файлы базы
#	задаем дату и время:
$d=get-date -uformat "%Y-%m-%d"
$t=get-date -uformat "%H:%M"
#	имя пользователя: (а надо ли?)
$UserName   = "$env:username"
$ErrorSleep = 5
$NoError    = "нет"
#	количество срабатываний
$activation=0
$watcher_start_d = get-date -uformat "%Y-%m-%d"
$watcher_start_t = get-date -uformat "%H:%M"
#<--Описываем все переменные блока
#---#-------------------------------------------------------------------------------------------------------
#-->Функция форматирования строки в екселе
function Excel_format_1 {
	$lineStyle  = "microsoft.office.interop.excel.xlLineStyle"  -as [type]
	$colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
	#---по центру, рамка, выделить жирным
	$selection.Interior.ColorIndex = 40
	$selection.VerticalAlignment   = -4108	#по центру
	$selection.HorizontalAlignment = -4108	#по центру
	# Выделяем таблицу (рамка)
	$selection.borders.LineStyle   = $lineStyle::xlContinuous
	$selection.borders.ColorIndex  = $colorIndex::xlColorIndexAutomatic
	# Разукрашиваем
	$selection.Font.Size           = 12
	$selection.Font.ColorIndex     = 55
	$selection.Font.Color          = 8210719
	# Выделяем жирным
	$selection.Font.Bold           = $true
	# Ровняем ширину столбцов
	$UsedRange = $ws.UsedRange
	$UsedRange.EntireColumn.AutoFit() | Out-Null
}
function Excel_format_2 {
	$lineStyle  = "microsoft.office.interop.excel.xlLineStyle"  -as [type]
	$colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
	#---по центру, по лево
	$selection.VerticalAlignment   = -4108	#по центру
	$selection.HorizontalAlignment = -4131	#по лево
	# Ровняем ширину столбцов
	$UsedRange = $ws.UsedRange
	$UsedRange.EntireColumn.AutoFit() | Out-Null
}
#--<Функция форматирования строки в екселе
#-->Функция лога перемещений
function moves_log {
	$ex = new-object -com Excel.Application
	$wb = $ex.Workbooks.Open("$PathOut\moves_log.xlsx")
	$ws = $wb.Worksheets.Item(1)
	$Row = $ws.Range("A65536").End(-4162).Row + 1
	# Заполняем
	$ws.Cells.Item($Row,1) = $d
	$ws.Cells.Item($Row,2) = $t
	$ws.Cells.Item($Row,3) = $FileZipCurrent.name
	$ws.Cells.Item($Row,4) = $FileXmlCurrent.name
	$ws.Cells.Item($Row,5) = $DocTypeRus
	$ws.Cells.Item($Row,6) = $CadastralNumber
	$ws.Cells.Item($Row,7) = $DateCreateDoc
	$ws.Cells.Item($Row,8) = "->"
	$ws.Cells.Item($Row,9) = "`=ГИПЕРССЫЛКА(`"$OutPath`";`"$OutPath`")"
	$ws.Cells.Item($Row,10) = $OutName
	# Оформляем
	$selection = $ws.Range(("A{0}" -f $Row),("J{0}" -f $Row))
	#$selection.Select() | Out-Null
	Excel_format_2
	# закрываем
	$selection = $null
	$wb.Save()
	$wb.Close($false)
	$ex.Quit()
	$excel = $null
}
#--<Функция лога перемещений
#-->Функция лога ошибок
function error_log {
	$ex = new-object -com Excel.Application
	$wb = $ex.Workbooks.Open("$PathOut\moves_log.xlsx")
	$ws = $wb.Worksheets.Item(2)
	$Row = $ws.Range("A65536").End(-4162).Row + 1
	# Заполняем
	$ws.Cells.Item($Row,1) = $d
	$ws.Cells.Item($Row,2) = $t
	$ws.Cells.Item($Row,3) = $FileXmlCurrent.name
	$ws.Cells.Item($Row,4) = $ErrorText
	$ws.Cells.Item($Row,5) = $ErrorHelp
	# Оформляем
	$selection = $ws.Range(("A{0}" -f $Row),("E{0}" -f $Row))
	#$selection.Select() | Out-Null
	Excel_format_2
	# закрываем
	$selection = $null
	$wb.Save()
	$wb.Close($false)
	$ex.Quit()
	$excel = $null
}
#--<Функция лога ошибок
#-->Функция формирования пути и имени файла
function Out_PathAndName ($CadastralNumber) {
	# разбить кадастровый номер на подстроки по ":" в итоге имеем следующие переменные:
	$Cad_Region      = $CadastralNumber.split(":")[0]
	$Cad_Rayion      = $CadastralNumber.split(":")[1]
	$Cad_Kvartal     = $CadastralNumber.split(":")[2]
	$Cad_Uchastok    = $CadastralNumber.split(":")[3]
	# выровняем значение участка до 4 знаков
	Switch ($Cad_Uchastok.length) {
		1 {$Cad_Uchastok = "000$Cad_Uchastok"}
		2 {$Cad_Uchastok = "00$Cad_Uchastok"}
		3 {$Cad_Uchastok = "0$Cad_Uchastok"}
	}
	if ($Cad_Region -eq $null) {
		$ErrorCode = "04-01"
		$ErrorText = "не удалось определить регион ($Cad_Region)"
		$ErrorHelp = 'вообще то такой ошибки быть не должно'
		#error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
	}
	# загрузим регионы в массив:
	if (test-path "$PathBase\regions.txt") {
		$BaseRegions = Get-Content "$PathBase\regions.txt" | %{ConvertFrom-StringData -StringData $_}
		$Region = $BaseRegions[$Cad_Region]."r$Cad_Region" # регион Русскми буквами $Region (значение [строки] после "rРЕГИОН=")
	} else {
		$ErrorCode = "04-02"
		$ErrorText = "отсутствует перечень регионов"
		$ErrorHelp = "поместите файл regions.txt в каталог $PathPrefix\base"
		#error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
	}
	# загрузим районы в массив:
	if (test-path "$PathBase\$Cad_Region`_rayion.txt") {
		$BaseRayions = Get-Content "$PathBase\$Cad_Region`_rayion.txt" | %{ConvertFrom-StringData -StringData $_}
		$Rayion = $BaseRayions[$Cad_Rayion]."r$Cad_Rayion" # район Русскми буквами $Rayion
		# каталог и имя файла-результата:
		$OutPath = "$PathOut\$Cad_Region $Region\$Cad_Region-$Cad_Rayion $Rayion\$Cad_Region-$Cad_Rayion-$Cad_Kvartal"
		if ($Cad_Uchastok -ne $null) {
			$OutName = "$DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal`-$Cad_Uchastok от $DateCreateDoc`.xml"
		}else{
			$OutName = "$DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal от $DateCreateDoc`.xml"
		}
	} else {
		$ErrorCode = "04-03"
		$ErrorText = "отсутствует перечень районов по $Cad_Region региону ($Region)"
		$ErrorHelp = "поместите файл $Cad_Region`_rayion.txt в каталог $PathPrefix\base"
		#error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
	}
	#на выходе:
	$ErrorCode
	$ErrorText
	$ErrorHelp
	
	$Cad_Region
	$Cad_Rayion
	$Cad_Kvartal
	$Cad_Uchastok
	
	$Region
	$Rayion
	
	$OutPath
	$OutName
}
#--<Функция формирования пути и имени файла
#---#-------------------------------------------------------------------------------------------------------
#-->Если таблицы нет, создаем
if (!(test-path "$PathOut\moves_log.xlsx")) {
#-->Первый лист
	$ex = New-Object -Com Excel.Application
	$wb = $ex.Workbooks.Add()
	$ws = $wb.Worksheets.Item(1)
	$ws.Name = 'ОТЧЕТ'
	$Row=1
	# Заполняем
	$ws.Cells.Item($Row,1) = "дата"
	$ws.Cells.Item($Row,2) = "время"
	$ws.Cells.Item($Row,3) = "имя архива"
	$ws.Cells.Item($Row,4) = "имя файла"
	$ws.Cells.Item($Row,5) = "тип документа"
	$ws.Cells.Item($Row,6) = "кадастровый номер"
	$ws.Cells.Item($Row,7) = "актуальность"
	$ws.Cells.Item($Row,8) = "->"
	$ws.Cells.Item($Row,9) = "новое хранилище"
	$ws.Cells.Item($Row,10) = "новое имя"
	# Оформляем
	$selection = $ws.Range(("A{0}" -f $Row),("J{0}" -f $Row))
	#$selection.Select() | Out-Null
	Excel_format_1
#-->Второй лист
	$ws = $wb.Worksheets.Item(2)
	$ws.Name = 'ОШИБКИ'
	$Row=1
	# Заполняем
	$ws.Cells.Item($Row,1) = "дата"
	$ws.Cells.Item($Row,2) = "время"
	$ws.Cells.Item($Row,3) = "имя файла"
	$ws.Cells.Item($Row,4) = "текст ошибки"
	$ws.Cells.Item($Row,5) = "причина"
	# Оформляем
	$selection = $ws.Range(("A{0}" -f $Row),("E{0}" -f $Row))
	#$selection.Select() | Out-Null
	Excel_format_1
	$selection = $null
	$wb.SaveAs("$PathOut\moves_log.xlsx")
	$wb.Close($false)
	$ex.Quit()
	$excel = $null
}
#--<Если таблицы нет, создаем
#---#-------------------------------------------------------------------------------------------------------
#-->Наблюдатель за папкой. при появлении файла, обрабатывает его:
while($TRUE){
	Clear-Host
	Write-Host "наблюдаем за`t$PathIn\"
	Write-Host "наблюдаем с`t$watcher_start_d  $watcher_start_t"
	Write-Host "срабатываний`t$activation"
	if ($DocTypeRus -ne $null) {
		Write-Host "-----------------------------------------"
		if ($AText1 -ne $null) {Write-Host "$AText1"}
		if ($AText2 -ne $null) {Write-Host "$AText2"}
		if ($AText3 -ne $null) {Write-Host "$AText3"}
		if ($AText4 -ne $null) {Write-Host "$AText4"}
		if ($AText5 -ne $null) {Write-Host "$AText5"}
		Write-Host "-----------------------------------------"
	}
	Remove-Variable FilesZip,FilesXml -ErrorAction SilentlyContinue
	$FilesZip = Get-ChildItem $PathIn\* -Include *.zip
	$FilesXml = Get-ChildItem $PathIn\* -Include *.xml
	# шапка
	$WinTitle=(get-host).UI.RawUI
	$WinTitle.WindowTitle="XML-ГКН ($activation)"
	if (($FilesZip -eq $null) -and ($FilesXml -eq $null)) {
		start-sleep 10 # задержка перед следующим проходом
		continue
	} else {
#-->	старт основному файлу
		Clear-Host
		#-->Обработка архивов
		if ($FilesZip -ne $null) {
			Remove-Variable FileZipCurrent_count,FilesZip_count -ErrorAction SilentlyContinue
			ForEach	($FileZipCurrent in $FilesZip) {	#каждое значение $FilesZip делаем с $FileZipCurrent:
				if ($FilesZip.count -ge "2") {			#проверка на пустое значение (если 1 файл, то не записывается)
					$FilesZip_count = $FilesZip.count
				} else {
					$FilesZip_count = 1
				}
				$FileZipCurrent_count++
#-->			#	извлекаем из архива:
				$PathZip="$PathIn\"
				[string]$zipfilename = $FileZipCurrent
				[string]$destination = $PathZip
				if(test-path($FileZipCurrent)) {
					$shellApplication = new-object -com shell.application
					$zipPackage = $shellApplication.NameSpace($zipfilename)
					$destinationFolder = $shellApplication.NameSpace($destination)
					$destinationFolder.CopyHere($zipPackage.Items())
				}
				#	удаляем архив:
				Remove-Item "$FileZipCurrent"
			}#<--Обработка zip
		} else {	#	не найдены zip
			Write-Host "не найдены zip-архивы. ищем xml..." -ForegroundColor Yellow
			start-sleep 1
#-->		#	Обработка xml
			$FilesXml = Get-ChildItem $PathIn\* -Include  *.xml
			if ($FilesXml -ne $null) {
				Remove-Variable FileXmlCurrent_count,FilesXml_count -ErrorAction SilentlyContinue
				ForEach ($FileXmlCurrent in $FilesXml) {	#	каждое значение $FilesXml делаем с $FileXmlCurrent:
					Remove-Variable ErrorCode,ErrorText,ErrorHelp -ErrorAction SilentlyContinue
					Remove-Variable info,DocNumber,DateCreateDoc,CadastralNumber,Cad_Region,Cad_Rayion,Cad_Kvartal,Cad_Uchastok,Region,Rayion -ErrorAction SilentlyContinue
					Remove-Variable DocTypeRus,DocType,DocVers,OutPath,OutName -ErrorAction SilentlyContinue
					if ($FilesXml.count -ge "2") {		#	Проверка на пустое значение (если 1 файл, то не записывается)
						$FilesXml_count = $FilesXml.count
					} else {
						$FilesXml_count = 1
					}
					$FileXmlCurrent_count++
					Clear-Host
					Write-Host "обрабатываем zip файл: $FileZipCurrent_count из $FilesZip_count `t($($FileZipCurrent.name))"
					Write-Host "обрабатываем xml файл: $FileXmlCurrent_count из $FilesXml_count `t($($FileXmlCurrent.name))"
					Write-Host "-------------------------------------------------------------------------------"
			#-->	#---Основоное действо---#
					$oXmlDocument = New-Object -TypeName System.Xml.XmlDocument #	создаем новый объект как xml
					$oXmlDocument.load($FileXmlCurrent) #	загружаем текущий файл в переменную обработки
					$DocType = $oXmlDocument."xml-stylesheet".split("/")[6]
					$DocVers = $oXmlDocument."xml-stylesheet".split("/")[7]
					if ($DocType -ne $null) {		# тип документа из второй строки xml
						Switch ($DocType) {			# пройдемся по известным типам документов
							KPT {					# КПТ
								$DocTypeRus = "КПТ"
								Write-Host "тип документа:" `t `t $DocTypeRus
								Switch ($DocVers) {	# пройдемся по известным версиям документа (начал с 9, остальные старые)
									"09" {			# https://portal.rosreestr.ru/xsl/GKN/KPT/09/common.xsl
										Write-Host "версия документа:" `t $DocVers
										# получаем значения в переменные #--------------------------------------------------------------
										$DateCreateDoc   = $oXmlDocument.KPT.CertificationDoc.Date
										$CadastralNumber = $oXmlDocument.KPT.CadastralBlocks.CadastralBlock.CadastralNumber
										$info=Out_PathAndName ($CadastralNumber)
										if ($info[0]  -ne $null) {$ErrorCode    = $info[0]}
										if ($info[1]  -ne $null) {$ErrorText    = $info[1]}
										if ($info[2]  -ne $null) {$ErrorHelp    = $info[2]}
										if ($info[3]  -ne $null) {$Cad_Region   = $info[3]}
										if ($info[4]  -ne $null) {$Cad_Rayion   = $info[4]}
										if ($info[5]  -ne $null) {$Cad_Kvartal  = $info[5]}
										if ($info[6]  -ne $null) {$Cad_Uchastok = $info[6]}
										if ($info[7]  -ne $null) {$Region       = $info[7]}
										if ($info[8]  -ne $null) {$Rayion       = $info[8]}
										if ($info[9]  -ne $null) {$OutPath      = $info[9]}
										if ($info[10] -ne $null) {$OutName      = $info[10]}
									}			# закончили с 9 версией КПТ
									Default {	# что делать, когда версия КПТ не описана
										Write-Host "версия документа:" `t $DocVers
										$ErrorCode = "03-01"
										$ErrorText = "$DocVers версия $DocTypeRus не может быть обработана"
										$ErrorHelp = 'вышла новая версия XML-схемы'
									}			# закончили с вариантом, когда версия КПТ не описана
								}				# закончили с проходом по версиям КПТ
							}					# закончили с КПТ
							Vidimus {			# выписка
								$DocTypeRus = "КВЗУ"
								Write-Host "тип документа:" `t `t $DocTypeRus
								Switch ($DocVers) {
									"06" { # https://portal.rosreestr.ru/xsl/GKN/Vidimus/06/common.xsl
										Write-Host "версия документа:" `t $DocVers
										# получаем значения в переменные #--------------------------------------------------------------
										$DateCreateDoc   = $oXmlDocument.KVZU.CertificationDoc.Date
										$CadastralNumber = $oXmlDocument.KVZU.Parcels.Parcel.CadastralNumber
										$info=Out_PathAndName ($CadastralNumber)
										if ($info[0]  -ne $null) {$ErrorCode    = $info[0]}
										if ($info[1]  -ne $null) {$ErrorText    = $info[1]}
										if ($info[2]  -ne $null) {$ErrorHelp    = $info[2]}
										if ($info[3]  -ne $null) {$Cad_Region   = $info[3]}
										if ($info[4]  -ne $null) {$Cad_Rayion   = $info[4]}
										if ($info[5]  -ne $null) {$Cad_Kvartal  = $info[5]}
										if ($info[6]  -ne $null) {$Cad_Uchastok = $info[6]}
										if ($info[7]  -ne $null) {$Region       = $info[7]}
										if ($info[8]  -ne $null) {$Rayion       = $info[8]}
										if ($info[9]  -ne $null) {$OutPath      = $info[9]}
										if ($info[10] -ne $null) {$OutName      = $info[10]}
									}			# закончили с 6 версией КВЗУ
									Default {	# что делать, когда версия КВЗУ не описана
										Write-Host "версия документа:" `t $DocVers
										$ErrorCode = "03-01"
										$ErrorText = "$DocVers версия $DocTypeRus не может быть обработана"
										$ErrorHelp = 'вышла новая версия XML-схемы'
									}			# закончили с вариантом, когда версия КВЗУ не описана
								}				# закончили с проходом по версиям КВЗУ
							}					# закончили с КВЗУ
							Vidimus_KP {		# кадастровый паспорт
								$DocTypeRus = "КПЗУ"
								Write-Host "тип документа:" `t `t $DocTypeRus
								Switch ($DocVers) {
									"03" { # https://portal.rosreestr.ru/xsl/GKN/Vidimus_KP/03/common.xsl
										Write-Host "версия документа:" `t $DocVers
										$КПЗУ_счетчик++
										# получаем значения в переменные #--------------------------------------------------------------
										$DateCreateDoc   = $oXmlDocument.Region_Cadastr_Vidimus_KP.Package.Certification_Doc.Date
										$CadastralNumber = $oXmlDocument.Region_Cadastr_Vidimus_KP.Package.Federal.Cadastral_Regions.Cadastral_Region.Cadastral_Districts.Cadastral_District.Cadastral_Blocks.Cadastral_Block.Parcels.Parcel.CadastralNumber
										$info=Out_PathAndName ($CadastralNumber)
										if ($info[0]  -ne $null) {$ErrorCode    = $info[0]}
										if ($info[1]  -ne $null) {$ErrorText    = $info[1]}
										if ($info[2]  -ne $null) {$ErrorHelp    = $info[2]}
										if ($info[3]  -ne $null) {$Cad_Region   = $info[3]}
										if ($info[4]  -ne $null) {$Cad_Rayion   = $info[4]}
										if ($info[5]  -ne $null) {$Cad_Kvartal  = $info[5]}
										if ($info[6]  -ne $null) {$Cad_Uchastok = $info[6]}
										if ($info[7]  -ne $null) {$Region       = $info[7]}
										if ($info[8]  -ne $null) {$Rayion       = $info[8]}
										if ($info[9]  -ne $null) {$OutPath      = $info[9]}
										if ($info[10] -ne $null) {$OutName      = $info[10]}
									}			# закончили с 3 версией КПЗУ
									Default {	# что делать, когда версия КПЗУ не описана
										Write-Host "версия документа:" `t $DocVers
										$ErrorCode = "03-01"
										$ErrorText = "$DocVers версия $DocTypeRus не может быть обработана"
										$ErrorHelp = 'вышла новая версия XML-схемы'
									}			# закончили с вариантом, когда версия КПЗУ не описана
								}				# закончили с проходом по версиям КПЗУ
							}					# закончили с КПЗУ
							
							
							
							
							
							
							
							
							
							
							
							
							
							Default {			# что делать, когда тип документа не описан
								$ErrorCode = "02-01"
								$ErrorText = "тип документа $DocType не может быть обработан"
								$ErrorHelp = 'скорее всего изменилось наименование документа($DocType) в xml'
								#error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
								#rename-item -path "$FileXmlCurrent" -newname "$($FileXmlCurrent.name)`.ОШИБКА"
								#break
							}
						}						# закончили с проходом по типам документов
					} else {					# не удалось определить тип документа
						$ErrorCode = "01-01"
						$ErrorText = "не удалось определить тип документа"
						$ErrorHelp = 'в xml вторая строка должна начинаться с <?xml-stylesheet type="text/xsl" href="'
						#error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
						#break
					}
					#-->выше обработка xml ниже перемещение
					#
					#-->Описываем переменные полученные в результате работы<-----#
					#                                                            #
					#	$FileXmlCurrent   обрабатываемый xml файл                #
					#                                                            #
					#	$ErrorCode        код ошибки                             #
					#	$ErrorText                                               #
					#	$ErrorHelp                                             #
					#                                                            #
					#	$Cad_Region       кадастровый регион цифрами             #
					#	$Cad_Rayion       кадастровый район цифрами              #
					#	$Cad_Kvartal      кадастровый квартал цифрами            #
					#	$CadastralNumber  кадастровый номер цифрами полностью    #
					#                                                            #
					#	$Region           регион буквами                         #
					#	$Rayion           район буквами                          #
					#                                                            #
					#	$OutPath          сформированный путь                    #
					#	$OutName          сформированное имя                     #
					#                                                            #
					#<--Описываем переменные полученные в результате работы----->#
					#
					if ($ErrorCode -ne $null) {	#	если ошибки были
						Clear-Host
						Write-Host "-------------------------------------------------------------------------------" -ForegroundColor Yellow
						Write-Host "в процессе обработки xml возникла ошибка:" -ForegroundColor Yellow
						Write-Host "-------------------------------------------------------------------------------" -ForegroundColor Yellow
						Write-Host "Код ошибки:" `t $ErrorCode
						Write-Host "Текст:"    `t`t $ErrorText
						Write-Host "Действие:"   `t $ErrorHelp
						msg $UserName /TIME:9000 "$ErrorText"
						start-sleep $ErrorSleep
						$OutPath="$PathOut\проблемные\$ErrorCode"
						if (!(test-path "$OutPath\")) {						# проверка на существование каталоа, если нет:
							new-item -path $PathOut -name "проблемные\$ErrorCode" -type directory -force | Out-Null
						}
						if (test-path "$OutPath\$($FileXmlCurrent.name)") {	# проверка на существование файла в каталоге назначения, если занято:
							Write-Host "обратите внимание: такой файл уже имеется" -ForegroundColor Yellow
							Remove-Variable Flag_ReName,NamePlus -ErrorAction SilentlyContinue
							$NamePlus=1
							$OutNamePovtor = $(($FileXmlCurrent.name).Substring(0,($($FileXmlCurrent.name).Length -4)))
							While ($Flag_ReName -eq $null) {				# пока флаг пустой проверяем существование файла и добавляем 1 к NamePlus
								if (test-path "$OutPath\$OutNamePovtor ($NamePlus)`.xml") {
									$NamePlus++
								} else {
									$OutName = "$OutNamePovtor ($NamePlus)`.xml"
									$Flag_ReName=$NamePlus
								}
							}
						}
						move-item -path "$FileXmlCurrent" -destination "$OutPath\$OutName"
						if (test-path "$FileXmlCurrent`.sig") {
							$OutName = "$OutNamePovtor ($NamePlus)`.xml`.sig"
							move-item -path "$FileXmlCurrent`.sig" -destination "$OutPath\$OutName"
						}
						error_log ($d, $t, $FileXmlCurrent.name, $ErrorText, $ErrorHelp)
						moves_log ($d, $t, $FileZipCurrent.name, $FileXmlCurrent.name, $DocTypeRus, $DateCreateDoc, $OutPath, $OutName)
					} else {	#					если ошибок не было
						$NoError="да"
						###############------------------------------------------------------------------------------------#
						if ($DateCreateDoc -ne $null)    {Write-Host "дата формирования:" `t     $DateCreateDoc}
						if ($CadastralNumber -ne $null)  {Write-Host "кадастровый номер:" `t     $CadastralNumber}
						if ($Region -ne $null)           {Write-Host "регион:"         `t `t     $Region}
						if ($Rayion -ne $null)           {Write-Host "район:"       `t `t `t     $Rayion}
						###############------------------------------------------------------------------------------------#
						#-->перемещаем:
						if (!(test-path "$OutPath")) { #						проверка на существование каталога
							new-item -path $OutPath -type directory -force | Out-Null
						}
						if (!(test-path "$OutPath\$OutName")) { #				проверка на существование файла в каталоге назначения, если пусто:
							move-item -path "$FileXmlCurrent"					-destination "$OutPath\$OutName"
							moves_log ($d, $t, $FileZipCurrent.name, $FileXmlCurrent.name, $DocTypeRus, $DateCreateDoc, $OutPath, $OutName)
							if (test-path "$FileXmlCurrent`.sig") { #			проверка на наличие цифровой подписи
								move-item -path "$FileXmlCurrent`.sig"			-destination "$OutPath\$OutName`.sig"
							}
							# делаем файлы с координатами и ОСМ
							if (($DocTypeRus -eq "КПТ") -and ($DocVers -eq "09") -and ($($FileXmlCurrent.Length / 1Mb) -ge 5)) {
								Write-Host ""
								Write-Host "делаем файл с координатами"
								$Sek=((Measure-Command {
									$FileOutCSV = "$OutPath\Координаты к $DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal от $DateCreateDoc`.csv"
									# заполним заголовок
									"кадастровый номер;номер точки;X;Y;погрешность" | Out-File -FilePath $FileOutCSV -Encoding 'default'
									"1;2;3;4;5" | Out-File -Append -FilePath $FileOutCSV -Encoding 'default'
									$StrokKoordinat=0
									$oXmlDocument.KPT.CadastralBlocks.CadastralBlock.Parcels.Parcel |`
									ForEach-Object -Process {
										$CadNumUch = $_.CadastralNumber
										$_.EntitySpatial.SpatialElement.SpelementUnit |`
										ForEach-Object -Process {
											if ($_.SuNmb -ne $null) {
												$StrokKoordinat++
												"$CadNumUch;$($_.SuNmb);$($_.Ordinate.X -replace "\.",",");$($_.Ordinate.Y -replace "\.",",");$($_.Ordinate.DeltaGeopoint -replace "\.",",")"`
												| Out-File -Append -FilePath $FileOutCSV -Encoding 'default'
											}
										}
									}
								}).TotalSeconds.tostring("F00"))
								# всего секунд + сколько обработано строк
								Write-Host "--------------------------"
								Write-Host "секунд потрачено:" `t $Sek
								Write-Host "строк обработано:" `t $StrokKoordinat
								start-sleep $ErrorSleep
								Write-Host "создан файл:" `t `t "Координаты к $DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal от $DateCreateDoc`.csv"
								# делаем файл с ОМС
								if ($oXmlDocument.KPT.CadastralBlocks.CadastralBlock.OMSPoints.OMSPoint) {
									Write-Host ""
									Write-Host "делаем файл с ОМС"
									$Sek=((Measure-Command {
										$FileOutCSV = "$OutPath\ОМС к $DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal от $DateCreateDoc`.csv" 
										# заполним заголовок
										"Номер пункта опорной межевой сети на плане;Название и (или) номер, тип пункта опорной межевой сети;Класс опорной межевой сети;X;Y" | Out-File -FilePath $FileOutCSV -Encoding 'default'
										"1;2;3;4;5" | Out-File -Append -FilePath $FileOutCSV -Encoding 'default'
										$StrokOMS=0
										$oXmlDocument.KPT.CadastralBlocks.CadastralBlock.OMSPoints.OMSPoint |`
										ForEach-Object -Process {
											$StrokOMS++
											"$($_.PNmb);$($_.PName -replace ";"," ");$($_.PKlass -replace ";"," ");$($_.OrdX -replace "\.",",");$($_.OrdY -replace "\.",",")"`
											| Out-File -Append -FilePath $FileOutCSV -Encoding 'default'
										}
									}).TotalSeconds.tostring("F00"))
									# всего секунд + сколько обработано строк
									Write-Host "--------------------------"
									Write-Host "секунд потрачено:" `t $Sek
									Write-Host "строк обработано:" `t $StrokOMS
									Write-Host "создан файл:" `t `t "ОМC к $DocTypeRus на $Cad_Region`-$Cad_Rayion`-$Cad_Kvartal от $DateCreateDoc`.csv"
									start-sleep $ErrorSleep
								}
							}
						} else { #-->если занято
							Write-Host "обратите внимание: такой файл уже имеется" -ForegroundColor Yellow
							if (!(test-path "$PathOut\повторы")) {
								new-item -path "$PathOut\повторы" -type directory -force | Out-Null
							}
							Remove-Variable Flag_ReName,NamePlus -ErrorAction SilentlyContinue
							$NamePlus=1
							$OutNamePovtor = $OutName.Substring(0,($OutName.Length -4)) # срезаем 4 символа с конца
							While ($Flag_ReName -eq $null) { # пока флаг пустой проверяем существование файла и добавляем 1 к NamePlus
								if (!(test-path "$PathOut\повторы\$OutNamePovtor ($NamePlus)`.xml")) {
									$OutPath = "$PathOut\повторы\"
									$OutName = "$OutNamePovtor ($NamePlus)`.xml"
									$Flag_ReName=$NamePlus
									move-item -path "$FileXmlCurrent" -destination "$OutPath\$OutName"
									moves_log ($d, $t, $FileZipCurrent.name, $FileXmlCurrent.name, $DocTypeRus, $DateCreateDoc, $OutPath, $OutName)
									if (test-path "$FileXmlCurrent`.sig") {
										$OutName = "$OutNamePovtor ($NamePlus)`.xml`.sig"
										move-item -path "$FileXmlCurrent`.sig" -destination "$OutPath\$OutName"
									}
								} else {
									$NamePlus++
								}
							}
						} # /закончили с перемещением
					}
#-->				#	сообщение после обработки каждого файла
					Write-Host "-----------------------------------------"
					Write-Host "ищем следующий файл..."
					Write-Host ""
					start-sleep 2
					$activation++
					if ($NoError -eq "да") {
						if ($activation -eq 1) {$AText1 = "$activation`t$DocTypeRus`t$CadastralNumber"}
						if ($activation -eq 2) {$AText2 = "$activation`t$DocTypeRus`t$CadastralNumber"}
						if ($activation -eq 3) {$AText3 = "$activation`t$DocTypeRus`t$CadastralNumber"}
						if ($activation -eq 4) {$AText4 = "$activation`t$DocTypeRus`t$CadastralNumber"}
						if ($activation -eq 5) {$AText5 = "$activation`t$DocTypeRus`t$CadastralNumber"}
						if ($activation -gt 5) {
							$AText1 = $AText2
							$AText2 = $AText3
							$AText3 = $AText4
							$AText4 = $AText5
							$AText5 = "$activation`t$DocTypeRus`t$CadastralNumber"
						}
					}
				}	#	каждое значение $FilesXml делаем с $FileXmlCurrent
			} else {	#	не найдены xml
				Write-Host "не найдены xml-файлы..." -ForegroundColor Yellow
				start-sleep $ErrorSleep
				continue
			}
		}#<--Обработка xml (если не найдены zip)
	}#<--Если сработал активатор
}
 #/закончили со срабатыванием на файл в $ZipPath


на всякий случай, если кто решиться, скрипт и файлы которые он обрабатывает в архиве

Отправлено: 06:45, 08-04-2015

 

Ветеран


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

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


Код: Выделить весь код
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
Remove-Variable ex
Remove-Variable wb
Get-Process EXCEL | Stop-Process -Force
Get-Process EXCEL | Stop-Process -Force - Можно попробовать без нее для начала.

Отправлено: 09:04, 08-04-2015 | #2



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

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


Пользователь


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

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


хм.. если добавить команду exit то после выхода процесс EXCEL завершается сам.
а вот если скрипт закрыть нажатием на "x" то то остается висеть

Отправлено: 09:34, 08-04-2015 | #3


Ветеран


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

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


firstarey, А если добавить:
Код: Выделить весь код
stop-process $pid
Чему это больше соответствует exit или "x"?

Отправлено: 10:16, 08-04-2015 | #4


Пользователь


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

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


Цитата Foreigner:
stop-process $pid »
немного не понял Вас.
что должно быть в $pid ?

Отправлено: 11:43, 08-04-2015 | #5


Ветеран


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

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


firstarey, Это автоматическая переменная, pid хоста, в котором запущен скрипт. Подозреваю, что будет аналогично нажатию кнопки окна.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:53, 08-04-2015 | #6


Пользователь


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

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


Цитата Foreigner:
Подозреваю, что будет аналогично нажатию кнопки окна »
да, закрывает окно, завершая процесс.
но это совсем не то что мне нужно.
скрипт работает все время в режиме наблюдения за папкой:
Код: Выделить весь код
	if (($FilesZip -eq $null) -and ($FilesXml -eq $null)) {
		start-sleep 10 # задержка перед следующим проходом
		continue
	} else {# тут само действо
и завершать нужно не скрипт, а выяснить причину почему висит процесс excel и как этого избежать

Отправлено: 12:17, 08-04-2015 | #7


Ветеран


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

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


firstarey, Подозреваю, что excel com-object не закрывается, если не завершен скрипт. Попробуйте, что предложил Kazun

Отправлено: 12:25, 08-04-2015 | #8


Пользователь


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

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


Цитата Foreigner:
Попробуйте, что предложил Kazun »
Цитата Kazun:
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
Remove-Variable ex
Remove-Variable wb
Get-Process EXCEL | Stop-Process -Force »
данный вариант не подходит т.к. вырубает ВЕСЬ эксель. а если вдруг по работе что то открыто?

Цитата Foreigner:
excel com-object не закрывается, если не завершен скрипт »
получается что так и есть, но ведь эта функция присутствует в скрипте трижды, а висеть остается лишь 1 процесс. Возможно это значения не имеет, а под конкретную сессию PS создается конкретная сессия EXCEL

Отправлено: 12:34, 08-04-2015 | #9


Ветеран


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

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


Научитесь читать или попросите, кто умеет - Get-Process EXCEL | Stop-Process -Force - Можно попробовать без нее .

Отправлено: 12:38, 08-04-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Excel

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. E.v.g Программирование и базы данных 7 03-05-2018 22:18
2010 - Excel 2010 зависает при открытии файла Excel 2003 dinzhevatov Microsoft Office (Word, Excel, Outlook и т.д.) 9 18-06-2013 21:45
2003/XP/2000 - excel таблица из другой excel таблицы sesves Microsoft Office (Word, Excel, Outlook и т.д.) 2 16-03-2012 01:24
2010 - [решено] Excel | Команда "поиск решений в Excel Starter" Алина Мусаева Microsoft Office (Word, Excel, Outlook и т.д.) 3 29-11-2011 00:41
2007 - Excel | Вычисление времени в Excel Vowan Microsoft Office (Word, Excel, Outlook и т.д.) 1 01-02-2010 17:09




 
Переход