Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт корректно работает интерактивно, но нет данных при запуске через планировщик (http://forum.oszone.net/showthread.php?t=342213)

DJ Mogarych 16-09-2019 16:35 2888221

Скрипт корректно работает интерактивно, но нет данных при запуске через планировщик
 
Привет, коллеги!
Помогите разобраться, пожалуйста.

Есть скрипт, который задействует модуль 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 2888224

Попробуй написать тестовую заглушку с транскрипцией всего вывода в файл и там посмотришь на ошибки если вдруг они есть.
Нечто вроде такого планировщиком запусти:

Код:

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


DJ Mogarych 16-09-2019 20:05 2888248

Спасибо за способ логирования, я, честно говоря, и позабыл о нём.
Вот вывод ошибки:
Код:

Транскрибирование запущено, выходной файл 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 2888254

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

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

DJ Mogarych 16-09-2019 21:07 2888257

Сам командлет, диск локальный.
Больше того - у меня был старый код модуля для конвертирования 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 2888261

Ну как вариант - можно поизвращаться вот так https://stackoverflow.com/questions/...xcel-installed

DJ Mogarych 16-09-2019 21:31 2888266

Завтра попробую, отпишу. Сегодня сил уже нет.
Спасибо!

Iska 16-09-2019 22:52 2888270

Цитата:

Цитата DJ Mogarych
Powershell отлично работает с .xlsx вообще без Экселя через .NET »

Не покажете или направление не укажете?

DJ Mogarych 17-09-2019 09:45 2888310

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')"
Ещё находил варианты:

Iska 17-09-2019 18:03 2888359

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

DJ Mogarych 17-09-2019 22:57 2888385

Да, именно поэтому я и заморачивался с конвертацией.

Charg 27-09-2019 09:42 2889794

Кстати недавно решал похожую в каком-то смысле задачу с чтением и редактированием 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 2889797

Цитата:

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



Время: 14:42.

Время: 14:42.
© OSzone.net 2001-