Войти

Показать полную графическую версию : Excel


firstarey
08-04-2015, 06:45
Суть:
скрипт часть логов отписывает в ексель.
все отрабатывает корректно, но в диспетчере задач всегда висит один процесс 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,R ayion -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

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

Kazun
08-04-2015, 09:04
[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 - Можно попробовать без нее для начала.

firstarey
08-04-2015, 09:34
хм.. если добавить команду exit то после выхода процесс EXCEL завершается сам.
а вот если скрипт закрыть нажатием на "x" то то остается висеть

Foreigner
08-04-2015, 10:16
firstarey, А если добавить:

stop-process $pid

Чему это больше соответствует exit или "x"?

firstarey
08-04-2015, 11:43
stop-process $pid »
немного не понял Вас.
что должно быть в $pid ?

Foreigner
08-04-2015, 11:53
firstarey, Это автоматическая переменная, pid хоста, в котором запущен скрипт. Подозреваю, что будет аналогично нажатию кнопки окна.

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



и завершать нужно не скрипт, а выяснить причину почему висит процесс excel и как этого избежать

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

firstarey
08-04-2015, 12:34
Попробуйте, что предложил 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 »
данный вариант не подходит т.к. вырубает ВЕСЬ эксель. а если вдруг по работе что то открыто?

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

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

firstarey
08-04-2015, 12:57
Научитесь читать или попросите, кто умеет - Get-Process EXCEL | Stop-Process -Force - Можно попробовать без нее . »
я пробовал ОБА варианта.
добавление строк

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
Remove-Variable ex
Remove-Variable wb

перед закрытием
$ex.Quit()
не дает результат.
будте вежливы или проходите мимо.

как указано выше проблема в том, что excel com-object не завершает процесс excel пока скрипт не будет завершен корректным образом. Но в моем случае скрипт работает все время без завершения.

Это не критичная проблема, я хотел выяснить есть ли возможность дать понять PS, что Excel свое дело сделал и может быть завершен.

Kazun
08-04-2015, 13:02
Логично, что эти строки должны выполняться после команды $ex.Quit() , а не до.

firstarey
08-04-2015, 13:09
эти строки должны выполняться после команды $ex.Quit() »
к сожалению ситуацию это не спасло:
http://rghost.ru/7G6HVMFm8/image.png (http://rghost.ru/7G6HVMFm8.view)

firstarey
09-04-2015, 09:06
идея появилась, но с реализацией не получилось:

если добавить кнопку которая отвечает за установку флага выхода из цикла?
проблема в том, что форма и скрипт у меня живут отдельной жизнью - как их объединить?

Add-Type -assembly System.Windows.Forms

while($TRUE){
Clear-Host
Write-Host "$i"
start-sleep 1 # задержка перед следующим проходом
#добавляем функцию которая будет выполняться после нажатия клавиши:
$i++
if ($exit -eq 1) {
exit
}
}

#создаём форму
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='Видимое название формы'
$main_form.Width = 100
$main_form.Height = 100
$main_form.AutoSize = $true

#создаём кнопку
$button = New-Object System.Windows.Forms.Button
$button.Text = 'exit'
$button.Location = New-Object System.Drawing.Point(10,5)
#При нажатии на кнопку выполняется функция : Click_Button
$button.add_Click( {$main_form.Close(); $exit=1} );
$main_form.Controls.Add($button)
#отображаем форму
$main_form.ShowDialog()

corbis
21-04-2015, 02:38
Чтобы форма и скрипт "общались" между собой, у них должно быть что-то общее. Обычно это переменные.
Но, по умолчанию, все переменные локальные. Задайте глобальные переменные и всё получится.

$global:x -будет видеть и форма, и скрипт.

инспектор
11-12-2020, 00:47
Убрал всплывающий в конце "MsgBox" - Excel стал закрываться в процессах. "Чудный" microsoft.




© OSzone.net 2001-2012