Сценарий Powershell не может получить доступ к файлу при запуске в качестве запланированной задачи

Мой скрипт Powershell (2.0) имеет следующий фрагмент кода:

$fileName = "c:\reports\1.xlsx"
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
$workbook = $xl.workbooks.open($fileName)
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt

Я могу запустить этот скрипт в командной строке Powershell без проблем. Электронная таблица обновляется, и error.txt пуст. Однако, когда я запускаю его как задачу в планировщике задач, я получаю ошибки с первой строкой.

Исключение, вызывающее "Открыть" с аргументом (ами) "1": "Microsoft Office Excel не может получить доступ к файлу" C:\reports\1.xlsx ". Существует несколько возможных причин: имя файла или путь не существует. Файл используется другой программой. Книга, которую вы пытаетесь сохранить, имеет то же имя, что и текущая открытая книга.

Я запускаю задачу с теми же учетными данными, которые я использую для запуска сценария в командной строке Powershell. Когда я запускаю скрипт вручную, он может открывать, обновлять и сохранять электронную таблицу без проблем. Когда я запускаю его в планировщике задач, он не может получить доступ к электронной таблице.

Данный файл доступен для чтения / записи для всех пользователей. Я подтвердил, что могу открыть файл в Excel с теми же учетными данными. Если я создам новую электронную таблицу и введу ее имя в качестве $filename, я получу те же результаты. Я убедился, что в диспетчере задач нет экземпляров Excel.exe.

Как ни странно, если я использую get-content, у меня нет проблем. Кроме того, если я создаю новую таблицу, у меня нет проблем.

$fileName = "c:\reports\1.xlsx"
$xl = get-content $spreadsheet
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
# Commented out $workbook = $xl.workbooks.open($fileName)
$workbook = $xl.workbooks.add()
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt

Это отлично работает. Таким образом, Get-ChildItem может открыть файл без проблем. ComObject может открыть файл, если я запускаю его вручную, но не если он запускается как задача.

Я в недоумении. Есть идеи?

5 ответов

Решение

Я думаю, что вы нажали ошибку в Excel:

Вы должны создать папку (или две на 64-битных окнах):

(32Bit, всегда)

C: \ Windows \ System32 \ Config\systemprofile\Desktop

(64Bit)

C: \ Windows \ SysWOW64 \ Config\systemprofile\Desktop

У меня была такая же проблема, и это было единственное решение, которое я нашел.

Из форумов TechNet (с помощью PowerShell и Excel Excel при автоматизации)

Чтобы расширить то, что предоставил @TessellatingHeckler, вы можете запустить следующие команды в Powershell(как администратор / с повышенными правами), чтобы создать папки перед открытием Excel, в моем сценарии это устранило проблему:

New-Item -ItemType Directory -Force -Path C:\Windows\System32\config\systemprofile\Desktop
if ([Environment]::Is64BitProcess -ne [Environment]::Is64BitOperatingSystem)
{
    New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop
}

Приведенные выше решения не работали в моей среде SCSM 2012 Scorch, вместо этого я использовал PSExcel ( https://github.com/RamblingCookieMonster/PSExcel), который не зависит от наличия установленного Excel или ComObject.

Мне пришлось настроить запуск запланированной задачи «только тогда, когда пользователь вошел в систему» ​​(зашел на сервер в качестве учетной записи службы, которая запускает задачу, а затем отключает сеанс), поскольку это кажется ограничением для планировщика заданий и Excel. Это довольно хромой обходной путь, но он работает.

Чтобы повторить то, что сказал TessellationHeckler. Мне пришлось решить эту проблему в 64-битной системе, поэтому я использовал следующую команду, которая наконец-то заставила скрипт PowerShell работать через планировщик заданий:

      New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop
Другие вопросы по тегам