Войти

Показать полную графическую версию : [решено] Скрипт корректно работает интерактивно, но нет данных при запуске через планировщик


DJ Mogarych
16-09-2019, 16:35
Привет, коллеги!
Помогите разобраться, пожалуйста.

Есть скрипт, который задействует модуль ImportExcel.
Когда я запускаю его интерактивно, всё работает прекрасно, данные извлекаются из таблички, подсчитываются и высылаются на почту.
Например, данные:
20 яблок
8 груш
3 бананов

Когда я сую этот скрипт в планировщик, данные, которые должен делать модуль, отсутствуют. Письмо приходит (т. е., сам скрипт работает), но там
0 яблок
0 груш
0 бананов

Задача в планировщике создана под той же самой учёткой, выполнять под наивысшими правами, вне зависимости от регистрации пользователя.
Модуль лежит уже в четырёх местах:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules\ImportExcel
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ImportExcel
C:\Program Files\WindowsPowerShell\Modules\ImportExcel
C:\Program Files (x86)\WindowsPowerShell\Modules\ImportExcel

Строка запуска в планировщике:
powershell.exe c:\scripts\script_report.ps1 -executionpolicy bypass

Явно, что при неинтерактивном выполнении модуль не работает. Почему?

Charg
16-09-2019, 17:01
Попробуй написать тестовую заглушку с транскрипцией всего вывода в файл и там посмотришь на ошибки если вдруг они есть.
Нечто вроде такого планировщиком запусти:

Start-Transcript -Path C:\templog.log -Force -Append
Import-Module путь\module.psm1
тут какой-то командлет из модуля
Stop-Transcript

DJ Mogarych
16-09-2019, 20:05
Спасибо за способ логирования, я, честно говоря, и позабыл о нём.
Вот вывод ошибки:

Транскрибирование запущено, выходной файл C:\temp\templog.log
Приложению Microsoft Excel не удается получить доступ к файлу "E:\temp\reports\Отчет.xls". Это мож
ет быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.
C:\Program Files\WindowsPowerShell\Modules\ImportExcel\ConvertToExcelXlsx.ps1:53 знак:9
+ $null = $Excel.Workbooks.Open($xlsFile.FullName)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Ничего не понимаю. Путь правильный, файл не используется ничем, никакой книги не открыто. В конце концов, в интерактивном-то режиме работает!

Charg
16-09-2019, 20:43
А какая часть ругается ошибкой? Import-Module или сам командлет?
Если второе то тут либо спрашивать у разработчика нюансы реализации либо самому код ковырять.

И диск Е - локальный или сетевой? Что будет если открываемый файл положить в корень С и убрать пробелы\спец.символы\кириллицу из пути? И\или как-нибудь задать ему гарантированно доступный рабочий каталог.

DJ Mogarych
16-09-2019, 21:07
Сам командлет, диск локальный.
Больше того - у меня был старый код модуля для конвертирования xls в csv:
Function ExportWSToCSV ($excelFileName, $csvLoc) {
$excelFile = "$path" + $excelFileName + ".xls"
$E = New-Object -ComObject Excel.Application
$E.Visible = $false
$E.DisplayAlerts = $false
$wb = $E.Workbooks.Open($excelFile)
foreach ($ws in $wb.Worksheets)
{
$n = $excelFileName + "_" + $ws.Name
$ws.SaveAs($csvLoc + $n + ".csv", 6)
}
$E.Quit()
}
И он тоже не работает, видать, что-то происходит в момент обращения к COM-объекту Экселя...

Идиотизм в том, что Powershell отлично работает с .xlsx вообще без Экселя через .NET, но исходный файл именно .xls, и его надо сначала преобразовать во что-то человеческое.

Вот, нашёл ещё одну тему на другом форуме, где точно такая же ситуация:
http://www.cyberforum.ru/powershell/thread2326375.html

Charg
16-09-2019, 21:19
Ну как вариант - можно поизвращаться вот так https://stackoverflow.com/questions/27976854/how-to-convert-xls-to-csv-using-powershell-without-excel-installed

DJ Mogarych
16-09-2019, 21:31
Завтра попробую, отпишу. Сегодня сил уже нет.
Спасибо!

Iska
16-09-2019, 22:52
Powershell отлично работает с .xlsx вообще без Экселя через .NET »
Не покажете или направление не укажете?

DJ Mogarych
17-09-2019, 09:45
Iska, модуль ImportExcel - https://www.powershellgallery.com/packages/ImportExcel

Обнаружил, что в составе Офиса есть файл excelcnv.exe, в результате задача решилась так:
& "C:\Program Files (x86)\microsoft office\Office16\excelcnv.exe" -oice "$xls" "$($xls.FullName -replace '.xls','.xlsx')"

Ещё находил варианты:

Создавать папки C:\Windows\System32\config\systemprofile\Desktop, C:\Windows\SysWOW64\config\systemprofile\Desktop (https://stackoverflow.com/q/26217183) - не сработало.
Править разрешения DCOM у Microsoft Excel Application (https://superuser.com/q/579900) - не стал делать.
Также в LibreOfiice есть параметр --convert-to (https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters/ru) - не пробовал.

Iska
17-09-2019, 18:03
DJ Mogarych, спасибо, ясно. Если я правильно понимаю код, он работает только с новым форматом Рабочих книг, с 2007+. Ну, хотя бы и так.

DJ Mogarych
17-09-2019, 22:57
Да, именно поэтому я и заморачивался с конвертацией.

Charg
27-09-2019, 09:42
Кстати недавно решал похожую в каком-то смысле задачу с чтением и редактированием xlsx файла без установленного экселя в принципе. Помог модуль PSExcel.


$Excel = New-Excel -Path $xlpath
$Excel | Search-CellValue {$_ -like 'var_DATE'} -As Passthru | Set-CellValue -Value $DateText
$Excel | Search-CellValue {$_ -like 'var_SENDER'} -As Passthru | Set-CellValue -Value $($SenderTextbox.Text)
$Excel | Search-CellValue {$_ -like 'var_RECIPIENT'} -As Passthru | Set-CellValue -Value $($RecipientTextbox.Text)
if (Test-Path $printout) {
try
{
Remove-Item -Path $printout -Force -ErrorAction SilentlyContinue
}
catch
{
$displaytitle = "Error: can't overwrite $($printout)"
$displaystring = "Результат печати невозможно обновить т.к. он занят другой программой."
[System.Windows.MessageBox]::Show("$($displaystring)","$displaytitle","OK","Error")
$Form.Close()
$reader.Dispose()
break
}
}
$Excel | Save-Excel -Path $printout -Close

DJ Mogarych
27-09-2019, 09:49
Идиотизм в том, что Powershell отлично работает с .xlsx вообще без Экселя через .NET, но исходный файл именно .xls, и его надо сначала преобразовать во что-то человеческое. »




© OSzone.net 2001-2012