我有一个计划任务设置在一夜之间在一台机器上运行。此任务将遍历打印其中找到的所有文件的文件夹。登录时我可以毫无问题地运行该过程,但是当通过计划任务运行时它不会打印。
更多信息:
计划任务执行powershell脚本,该脚本执行多种功能,例如生成和通过电子邮件发送报告,跨网络文件夹复制文件以及最后打印文件夹的内容。如果执行帐户当前已登录,则所有这些任务都会无错误地执行。如果帐户未登录并通过计划任务运行,则除了打印Office和PDF文档之外的所有内容都能正常工作(文本文档打印正常)。
这是我用来打印文档的功能。
Function Print-File($file)
{
begin
{
function internal-printfile($thefile)
{
if ($thefile -is [string])
{
$filename = $thefile
}
else
{
if ($thefile.FullName -is [string] )
{
$filename = $thefile.FullName
}
}
$start = new-object System.Diagnostics.ProcessStartInfo $filename
$start.Verb = "print"
[System.Diagnostics.Process]::Start($start)
}
if ($file -ne $null)
{
$filespecified = $true;
internal-printfile $file
}
}
process
{
if (!$filespecified)
{
$test = write-Host process ; internal-printfile $_
}
}
}
当从计划任务运行时,我可以看到进程开始(Winword或AcroRd32),因为我将输出转储到文本文件但是我没有看到任何打印。我注意到的另一个不同之处是,当我在登录Adobe Reader以外的应用程序(Office Apps)时使用此功能时,开始打印文档然后关闭。但是,从计划任务运行时,应用程序不会自行关闭。
我很感激此时的任何反馈,建议或指示,因为我知道还有什么可以检查,我已经碰壁了。我还会就完成文件打印的另一种方法提出建议。 (注意:我无法预测文件夹中的文件类型)
注意:运行Office 2007和Adobe Reader 10.1.7的两台计算机(Windows Server 2008和Windows 7)上都存在这些症状
答案 0 :(得分:0)
我正在尝试做你正在尝试的事情。我很确定你遇到的是会话0隔离。您可以在this MSDN网站和this Windows博客帖子上阅读更多相关信息。
我没有尝试过以下关于SO的另一个问题的答案中的建议,但可能值得一试。 Creating Desktop-Folders for session 0
Here is another guy在没有用户登录计算机的情况下尝试打印。有人声称知道如何做我们都想做的事,但他实际上没有发布答案。
答案 1 :(得分:0)
对于OP来说太晚了,但对于未来的读者......我遇到了同样的问题,但是使用了Windows shell .bat文件,而不是PowerShell。作为计划任务,该脚本将启动AcroRd32.exe / t,但它不会打印任何内容。然后在一段时间后,Acrobat停止了,文件被移动到“Printed”文件夹,就像一切都很好。它独立打印,不作为计划任务。
(背景:我在一台旧电脑上运行Windows 10 x86,以便我们可以使用我们的两台防弹HP LaserJet 1000打印机。但是,我们在Win 7中使用的程序,batchdocprint,与Win 10不兼容,公司已经不见了。由于必须学习神秘的语法和解决方法,我花了很多钱在几个小时内得到几行代码(下面)工作正常而不是程序成本,但我找不到合适的替代品。我发现的程序打印不正确,或只有一台打印机的选项。)
我遇到的问题似乎是阻止GDI +的Session 0隔离。我选择了看似“垃圾”的建议来获取福昕阅读器。它起作用,就像Acrobat一样,读者是免费的。我刚刚使用FoxitReader.exe的路径替换了AcroRd32.exe的路径
我认为使用Acrobat Reader无法做到这一点。 CLI没有得到官方支持,因此Adobe在不启动GUI的情况下将其更改为打印的可能性很小。
就其他文件类型而言,它取决于您用于打印它们的内容,以及它是否可以在没有GUI的情况下打开和打印。我还没有决定是否为其他常见文件类型实现此功能,以便我们可以拖放,或者强制用户使用设置为在热文件夹中保存PDF的Acrobat PDF打印机。现在,它是后者。
我的代码,作为参考,希望能让别人省去我的头痛。我只更改/缩短了名称,并删除了第二个文件夹/打印机的重复代码。请注意,taskkill需要管理权限。此外,您可能需要在热文件夹中有一个名为“Printed”的文件夹,因为我没有检查它的存在:
@ECHO OFF
REM Monitors folders for PDF's and prints.
REM Use PING for delay - no built-in sleep functionality.
REM Using START backgrounds the process so the script can move on.
:LOOP
cd C:\Hot Folder\
for %%a in ("*.pdf") do (
start "" "C:\Path\To\FoxitReader.exe" /t "C:\Hot Folder\%%a" "HP 1000"
ping 1.1.1.1 -n 2 -w 5000 >NUL
taskkill /IM FoxitReader.exe /F
move /Y "%%a" ".\Printed\%%a")
ping 1.1.1.1 -n 2 -w 5000 >NUL
goto LOOP
答案 2 :(得分:0)
不确定您是否找到了解决方案,但是任务调度程序作业使用的打印机应该在以下位置注册:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Printers(本地打印机)
VS
HKEY_Current_User \ Printers \ Connections(会话打印机)