0

我正在使用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
4

5 回答 5

3

弄清楚了。我什至没有想过在 32 和 64 版本的 powershell 中设置执行策略。当手动运行它时,它正在使用一个,而通过计划任务运行它正在使用另一个。一旦我确定两者都设置好了,一切都很好。谢谢大家的回复。

于 2013-02-01T20:13:47.323 回答
2

保持脚本不变,然后从 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'"

确保在需要的地方更改值以反映正确的文件名。

于 2013-02-01T10:20:44.333 回答
1

你确定你的脚本不仅仅是因为你的shell内存不足而失败了吗?您可以通过以下方式增加它:

 Set-item wsman:localhost\Shell\MaxMemoryPerShellMB 512

我们遇到了具有诸如您这样的问题的脚本的问题,因此它总是值得一试。

于 2013-02-01T10:26:57.723 回答
0

请使用 Write-Host 注释每一行,并尝试使用计划任务运行此 powershell。使用计划任务管理器时出现写入主机错误。

    $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
于 2013-02-01T03:19:54.293 回答
0

听起来您想在脚本运行时查看它的进度,但如果这不重要,您可以尝试创建一个 .vbs 脚本并运行它。

command = "powershell.exe -command C:\test\C:\temp\Script1.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0
Set WinScriptHost = Nothing
于 2013-02-01T12:59:36.120 回答