Запуск сценария 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