2013-01-31 9 views
0

아래의 powershell 스크립트를 사용하여 여러 단어 문서를 열고 양식 필드를 업데이트 한 다음 닫습니다. 먼저이 스크립트가 명령 줄에서 실행되거나 파일을 마우스 오른쪽 버튼으로 클릭하고 어떤 식 으로든 수동으로 수행하여 Run with Powershell을 선택하면 정상적으로 실행됩니다. 그러나이 작업을 예약 된 작업으로 실행하려고하면 두 가지 중 하나가 발생합니다.Powershell 스크립트를 예약 된 작업으로 실행

나는 이것을 위해 여러 가지 다른 형식의 구문을 시도했지만 모두 동일한 두 결과 중 하나를 생성합니다. 어느 쪽이든 A) 스크립트는 시작하지 않고 약 3 초 만에 시작하거나 끝나거나, B) 스크립트가 시작되어 작업 관리자에서 Word가 열리는 것을 볼 수 있지만 정상적으로 그리고 Word처럼 진행 상황을 보여주는 명령 창이 없습니다. 약 2 분 후에 끊어진다. 실제로 B 옵션을 사용하는 유일한 구문은 액션으로 .B Script1ps1을, 인수로는 폴더 powershell을 넣고 폴더는 시작 위치로 사용합니다. 이 구문의 약간의 변형, 예를 들어 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 
+0

내 첫 번째 추측은 일부 특권의 문제라고 생각합니다. 예약 된 작업을 실행하기 위해 어떤 사용자를 사용합니까? 해당 사용자가 파일을 읽고 쓸 수있는 권한을 갖고 있습니까? – Gisli

+2

"hello"로 일부 test.ps1을 예약하십시오. out-file. \ test.txt를 작성하고 [this Scripting Guys post]를 확인하십시오. (http://blogs.technet.com/b/heyscriptingguy/archive/2011/01/12/use-scheduled-tasks-to-run- powershell-commands-on-windows.aspx) 및 [this serverfault thread] (http://serverfault.com/questions/101671/scheduled-tasks-w-gui-issue) – noam

답변

3

알아 냈어. PowerShell의 32 및 64 버전 모두에서 실행 정책을 설정한다고 생각조차하지 않았습니다. 수동으로 실행할 때 하나를 사용하고 예약 된 작업을 통해 실행하는 것은 다른 하나를 사용하는 것이 었습니다. 일단 내가 둘 다 설정 되었다면, 모든 것이 좋은 것입니다. 답변 해 주셔서 감사합니다.

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 
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 

는 weekely 작업을 만들 것이며, 작동 여부를 테스트 할 수 있도록 마지막 줄은 즉시 예약 된 작업을 실행합니다. 이 경우 $ Schedule을 필요한 시작 시간과 일치하도록 수정할 수 있습니다.

나는 Schtasks는 명령 줄에서 두 개의 별도의 날짜에 작업을 실행하는 방법을 찾을 수 있지만, 다음과 같이 나는 주위에 일을 발견 :

1) 내부의 시간 정의가 다음과 같은 XML을 생성 그것은 :

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

올바른 파일 이름을 반영하도록 필요한 경우 사용자가 값을 변경해야합니다 :

<?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) 다음과 같이 $ 일정 변수를 설정 에스.

+0

원할 경우 일정 라인을 어떻게 다시 작성합니까? 하루에 두 번, 자정에 한 번, 오전 5시에 한 번 이렇게해야합니까? –

+0

여기에 충분한 공간이 없어서 다른 대답을 게시 할 것입니다. –

+0

원래 대답을 업데이트했습니다. –

1

셸 메모리가 부족하여 스크립트에 실패하지 않았습니까? 당신은 그것을 증가시킬 수있다 : 같은 당신 때문에 그것의 항상 가치 시도와 같은 문제가 스크립트

Set-item wsman:localhost\Shell\MaxMemoryPerShellMB 512 

우리는 했어 문제.

+0

시도해 보니, 행운이 없습니다. 이것이 문제라면 수동으로 ps를 실행할 때 스크립트가 작동합니까? –

+0

잘 그것은 정말로 긴 발사이었다. –

0

스크립트가 실행될 때 스크립트의 진행 상황을보고 싶지만 중요하지 않은 경우 .vbs 스크립트를 만들어 실행 해보십시오.

command = "powershell.exe -command C:\test\C:\temp\Script1.ps1" 
set shell = CreateObject("WScript.Shell") 
shell.Run command,0 
Set WinScriptHost = Nothing