从任务调度程序运行的Powershell脚本无法打开word文档

时间:2014-07-23 16:43:27

标签: powershell scripting ms-word scheduled-tasks

我正在尝试使用powershell脚本从多个word文件中获取wordcount,然后将其输出到csv文件。从powershell提示符运行时,这可以正常工作,直接从cmd提示符或从perl脚本内部调用时可以正常工作,但是当作为计划任务调用时脚本无法工作。

这是 ExecutionPolicy问题导致脚本根本无法运行。脚本正在运行并产生一些输出,但是当从任务调度程序启动时,它无法打开任何word文档。

相关的powershell代码如下:

$folderpath = "C:\some\where\*"
$fileTypes = "*.docx"

$word = New-Object -ComObject word.application
$word.visible = $false
Get-ChildItem -path $folderpath -recurse -include $fileTypes |
foreach-object `
{
  $path =  ($_.fullname).substring(0,($_.FullName).lastindexOf("."))

  try {
    $doc = $word.documents.open($_.fullname, $confirmConversion, $readOnly, $addToRecent, $passwordDocument)
  } catch {
    "FROM CATCH UNABLE TO OPEN $($_.fullname)" >> $wordCountFile
  }
  if($doc) {
    $wordCount = $doc.ComputeStatistics("wdStatisticWords")
    "$($_.name), $wordCount"  >> $wordCountFile
    $doc.close([ref]$false)
  } else {
    "UNABLE TO OPEN $($_.fullname)" >> $wordCountFile
  }

} #end Foreach-Object
$word.Quit()

(请注意,人们引用从word文档中获取单词计数的替代方法实际上并不会返回正确的计数,因为此方法在工作时 。)

使用以下方式作为计划任务(设置为以最高权限运行并以管理员用户身份运行)时运行:

cmd /c start PowerShell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -File "C:\path\to\script\CountsInWords.ps1"

或者使用来自计划任务(我的正常用例)启动的perl脚本中的类似命令运行,并且在两种情况下,任务都设置为以最高权限运行,powershell脚本无法正常运行。

显然从未到达catch块,因为print语句永远不会到达文件,但$ doc始终为null。

此外,当作为一项任务启动时,脚本会打开一个单词进程并使用100%cpu作为1个线程,这最终会使我的机器瘫痪。

总结:

将脚本作为人类运行(无论多少级别的间接) - >完美地运作

从任务运行脚本(以管理员用户身份) - >脚本运行但无法访问word文档,尽管总是点击$ word.Quit行,也无法停止文字处理。

编辑:@ TheMadTechnician关于办公室第一次启动的建议,要求新用户需要一些细节:在进一步检查时,查看任务管理器中的流程,除非我没有看到流程这个词点击"显示来自所有用户"的流程,但随后会显示,但将用户列为我。如何将流程明确地列为我,但算作另一个用户?

尝试在脚本中设置$word.visible = $true在从任务计划程序启动时实际上没有显示任何内容,因此我不知道如何验证它是否在等待输入,或者如何把它作为正确的用户输入,让它消失......

1 个答案:

答案 0 :(得分:2)

您可以按照问题How to run a Windows 2008 task from the scheduler with "interact with desktop"命名的解决方案。

摘要:如果您有64位Windows:创建%SystemRoot%\SysWOW64\config\systemprofile\Desktop。如果您有32位Windows,请创建%SystemRoot%\system32\config\systemprofile\Desktop