0

以下のスクリプトを使用して、powershellいくつかの Word ドキュメントを開き、それらのフォーム フィールドを更新してから閉じています。まず、このスクリプトをコマンド ラインから実行するか、ファイルを右クリックしてRun with Powershell基本的に手動で実行することを選択して実行すると、問題なく実行されます。ただし、これをスケジュールされたタスクとして実行しようとすると、次の 2 つのいずれかが発生します。

このためにいくつかの異なる形式の構文を試しましたが、いずれも同じ 2 つの結果のうちの 1 つを生成します。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

理解した。PowerShell の 32 バージョンと 64 バージョンの両方で実行ポリシーを設定することは考えもしませんでした。手動で実行する場合は一方を使用し、スケジュールされたタスクを介して実行する場合はもう一方を使用していました。両方に設定されていることを確認したら、すべて問題ありません。ご回答ありがとうございます。

于 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 コマンド ラインから 2 つの別々の日付でタスクを実行する方法が見つかりませんでしたが、次のような回避策を見つけました。

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

シェルメモリが不足しているためにスクリプトが失敗しただけではありませんか? 次の方法で増やすことができます。

 Set-item wsman:localhost\Shell\MaxMemoryPerShellMB 512

あなたのような問題を含むスクリプトに問題があったため、常に試してみる価値があります。

于 2013-02-01T10:26:57.723 に答える
0

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
于 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 に答える