我正在尝试使用 powershell 脚本从多个单词文件中获取字数,然后将其输出到 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 block 显然永远不会到达,因为 print 语句永远不会到达文件,但 $doc 始终为 null。
此外,当作为任务启动时,脚本会打开一个字进程,并为 1 个线程使用 100% 的 cpu,这最终会损坏我的机器。
总结一下:
以人类方式运行脚本(无论有多少间接级别)-> 完美运行
从任务运行脚本(以管理员用户身份)-> 脚本运行但无法访问 Word 文档,也无法停止 Word 进程,尽管总是点击 $word.Quit 行。
编辑:根据@TheMadTechnician关于新用户首次启动办公室的建议,需要一些详细信息:在进一步检查中,查看任务管理器中的流程,我看不到流程一词,除非我单击“显示流程”所有用户”,但随后他们出现了,但将用户列为我。一个进程如何既明确列为我,又算作另一个用户?
尝试在脚本中设置 $word.visible = $true
从任务计划程序启动时实际上并没有显示任何内容,因此我不知道如何验证它是否正在等待用于输入,或者如何以正确的用户身份为其提供输入以使其消失......
最佳答案
您也许可以按照问题 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
。
关于从任务计划程序运行的Powershell脚本无法打开Word文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916290/