Назад | Перейти на главную страницу

Сценарий 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, я получу те же результаты. Я убедился, что в Диспетчер задач.

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

$fileName = "c:\reports\1.xlsx"
$xl = get-content $filename
$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 может открыть файл, если я запустил его вручную, но не как задачу.

Я в недоумении. Любые идеи?

Добавить -Нет профиля переключитесь на powershell.exe в запланированной задаче (отредактируйте задачу, перейдите в Действия вкладку, отредактируйте свое действие и в Добавить аргументы поле, добавить -Нет профиля в качестве первого аргумента.)

Взгляните сюда:

https://stackoverflow.com/questions/7106381/microsoft-office-excel-cannot-access-the-file-c-inetpub-wwwroot-timesheet-app

Вам просто нужно сделать это:

  1. Создайте каталог «C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop» (для 64-битной Windows) или «C: \ Windows \ System32 \ config \ systemprofile \ Desktop» (для 32-битной Windows)
  2. Установите права полного доступа для рабочего стола каталога (например, в Win7 и IIS 7 и DefaultAppPool установите разрешения для пользователя «IIS AppPool \ DefaultAppPool»)

У меня это сработало! Надеюсь, поможет