我正在尝试使用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
在从任务计划程序启动时实际上没有显示任何内容,因此我不知道如何验证它是否在等待输入,或者如何把它作为正确的用户输入,让它消失......
答案 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
。