Запуск сценария Powershell в качестве запланированной задачи

Я использую powershell Сценарий ниже, чтобы открыть несколько документов Word, обновить поля формы в них, а затем закрыть их. Во-первых, я отмечу, что если этот скрипт запускается из командной строки или щелкнув правой кнопкой мыши файл и выбрав Run with Powershell в основном, делая это вручную любым способом, он будет работать просто отлично. Однако, если я попытаюсь выполнить это как запланированное задание, произойдет одно из двух.

Я пробовал несколько различных форм синтаксиса для этого, но все они дают один и тот же результат. Либо A) Сценарий говорит, что он запустился и завершился примерно через 3 секунды, ничего не делая, либо B) Сценарий запускается, я вижу Word, открытое в диспетчере задач, но нет командного окна, показывающего прогресс, как обычно, и Word просто зависает примерно через 2 минуты. Единственный синтаксис, который привел меня к варианту B, это powershell в качестве действия.\Script1.ps1 в качестве аргумента и папку в качестве начала в расположении. Я попробовал несколько небольших вариаций этого синтаксиса, таких как использование полного пути powershellи т. д. Когда я заканчиваю Word в диспетчере задач, когда он зависает, запланированное задание сообщает, что оно успешно выполнено. У кого-нибудь есть идеи? Сценарий выглядит следующим образом:

    $filearray = 1..12
    $filename="E:\Form0801"
    $word=new-object -com Word.Application
    $word.Visible=$False            #Making this true 
    #does not show word if run from scheduled task
    Write-Host "DO NOT CLOSE THIS WINDOW!"

    try
    {
    foreach ($i in $filearray)
    {
        if($i -lt 10){$filename="E:\Form080" + $i + ".dot"}
        else{$filename="E:\Form08" + $i + ".dot"}
        $doc=$word.Documents.Open($filename)
        $word.ActiveDocument.Fields.Update()
        $doc.SaveAs([REF]$filename)
        $doc.Close()
        Write-Host "File " $filename " has been updated successfully"
    }

    }
    catch [System.Management.Automation.ActionPreferenceStopException] 
    {
        "A problem occurred while opening one of the files."
        $error[0]
    }

$word.Quit()
# End Word Application

5 ответов

Решение

Догадаться. Я даже не думал устанавливать политику выполнения в 32 и 64 версиях powershell. При ручном запуске он использовал один, а при выполнении запланированных задач - другой. Как только я удостоверился, что это было установлено оба, все хорошо, чтобы пойти. Спасибо всем за ваши ответы.

Сохраните ваш сценарий как есть и попробуйте следующее из командной строки Powershell.

$Schedule = "schtasks /CREATE /TN 'Word Doc' /SC WEEKLY /RL HIGHEST /TR powershell 'C:\temp\Script1.ps1' /F"
$Start = "schtasks /RUN /TN 'Word Doc'"
$Schedule = [ScriptBlock]::Create($Schedule)
$Start = [ScriptBlock]::Create($Start)
Invoke-Command -ScriptBlock $Schedule
Invoke-Command -ScriptBlock $Start

Это создаст выходное задание, и последняя строка немедленно выполнит запланированное задание, чтобы вы могли проверить, работает ли оно. Если это так, то вы можете изменить $Schedule в соответствии с требуемым временем запуска.

Я не смог найти способ запустить задачу с двумя отдельными датами из командной строки schtasks, но я нашел обходной путь следующим образом:

1) Создайте следующий XML, в котором есть определения времени:

    <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2013-02-01T00:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
    <CalendarTrigger>
      <StartBoundary>2013-02-01T05:30:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Actions Context="Author">
    <Exec>
      <Command>powershell</Command>
      <Arguments>C:\temp\Script1.ps1</Arguments>
    </Exec>
  </Actions>
</Task>

2) Установите переменную $Schedule следующим образом:

$Schedule = "schtasks /CREATE /XML 'C:\temp\Word Doc.xml' /TN 'Word Doc'"

Убедитесь, что вы изменили значения там, где это необходимо, чтобы отразить правильные имена файлов.

Вы уверены, что ваш скрипт не просто не работает, потому что у вас заканчивается память оболочки? Вы можете увеличить его с помощью:

 Set-item wsman:localhost\Shell\MaxMemoryPerShellMB 512

У нас были проблемы со сценариями, в которых были такие проблемы, как у вас, поэтому всегда стоит попробовать.

Пожалуйста, прокомментируйте каждую строку с помощью Write-Host и попробуйте запустить этот PowerShell с заданием расписания. Ошибка Write-Host при работе с диспетчером задач расписания.

    $filearray = 1..12
    $filename="E:\Form0801"
    $word=new-object -com Word.Application
    $word.Visible=$False            #Making this true 
    #does not show word if run from scheduled task
    #Write-Host "DO NOT CLOSE THIS WINDOW!"

    try
    {
    foreach ($i in $filearray)
    {
        if($i -lt 10){$filename="E:\Form080" + $i + ".dot"}
        else{$filename="E:\Form08" + $i + ".dot"}
        $doc=$word.Documents.Open($filename)
        $word.ActiveDocument.Fields.Update()
        $doc.SaveAs([REF]$filename)
        $doc.Close()
        #Write-Host "File " $filename " has been updated successfully"
    }

    }
    catch [System.Management.Automation.ActionPreferenceStopException] 
    {
        "A problem occurred while opening one of the files."
        $error[0]
    }

$word.Quit()
# End Word Application

Похоже, вы хотите видеть ход выполнения скрипта, но если это не важно, вы можете попробовать создать скрипт.vbs и запустить его вместо этого.

command = "powershell.exe -command C:\test\C:\temp\Script1.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0
Set WinScriptHost = Nothing
Другие вопросы по тегам