计划任务中的批处理文件返回代码 2147942401
Posted
技术标签:
【中文标题】计划任务中的批处理文件返回代码 2147942401【英文标题】:batch file from scheduled task returns code 2147942401 【发布时间】:2018-06-28 20:46:12 【问题描述】:我正在尝试使用 Windows 10 任务计划程序安排作业以运行批处理文件,但它导致返回代码 2147942401。
批处理文件位于远程位置,所以我给出了绝对路径 "\\server1\文件传输\数据文件\入站\abc\csv\excel-to-csv.bat"
如果我使用命令提示符运行批处理脚本,那么它可以正常工作。
批处理脚本是将excel转文件转csv。
脚本的内容是:
FOR /f "delims=" %%i IN ("\\server1\file transfers\Data Files\Inbound\abc\CSV\*.xlsx" ) DO to-csv.vbs "\\server1\file transfers\Data Files\Inbound\abc\*.xlsx" "%%~ni.csv"
它调用另一个 VB 脚本 to-cvs.vbs
如果我在@Steinspecht 提到的“操作”选项卡中进行更改(任务调度程序-任务“成功”完成,退出代码为 0x8007001),那么我也会收到代码 2147942401 Not sure whether Add a arguments is written correct
【问题讨论】:
\\server\sharename\folder\file.ext
你只有\server\...
确保使用允许访问网络共享的凭据运行任务:docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
只显示一个部分流程的屏幕截图,没有关于您的计划任务的更多信息,也没有批处理文件的信息或内容,并不能真正构成一个格式正确且内容足以吸引响应者的问题。请考虑editing your question,尤其是因为 *** 是为你的失败代码寻求帮助,没有你的代码,这个问题在技术上是题外话!
对我来说,“开始”是空的,导致了这个问题。设置此值可解决问题。
我刚刚发现 PowerShell 对远程脚本施加了额外的限制。我有同样的代码,因为我的脚本在网络共享上。我必须使用-ExecutionPolicy Bypass
运行脚本。出于某种原因,我在从交互式 shell 运行远程脚本时会看到一个错误,但最终它决定告诉我:cannot be loaded because you opted not to run this software now
。它还建议我使用 Unblock-File
cmdlet,但这不是我的选择(使用 GPO 在域机器上启动时运行脚本)
【参考方案1】:
任务计划程序的错误代码在 msdn 处以十六进制形式列出,您的代码 2147942401 转换为十六进制为 0x80070001(未在此处列出),但 this superuser 将其描述为“非法函数”。他通过使用“最简单的任务调度程序设置并且现在可以工作”解决了他的问题。我注意到他只在用户登录时运行他的任务,所以他不需要“作为批处理作业登录”。
如果您想在未登录时运行批处理作业,您需要一个名为“作为批处理作业登录”的特殊权限。请注意,还有一个“拒绝作为批处理作业登录”权限,这是您不想要的。
从Social Technet,您可以分配该权限
输入 secpol.msc /s 在 MSC 管理单元中选择“本地策略” 选择“用户权限分配” 右键单击“作为批处理作业登录”并选择属性 点击“添加用户或组”,并添加相关用户。您的任务调用网络资源。这些powershell scripters 建议将这些资源带到您的本地计算机上,以消除网络/连接/权限问题的任何可能性......但这可能并不总是合适或实用的。
【讨论】:
报告的错误代码2147942401实际上是Windows的“代码1”的说法。据我的运维人员说,其他位是元数据。返回 99 时显示 2147942499。 那么,它是否按照msdn解析为SCHED_S_TASK_RUNNING? 不,SCHED_S_TASK_RUNNING
是任务状态,而不是可执行文件的返回码。任务可以处于“运行”状态,但可执行文件在完成之前无法返回代码。【参考方案2】:
即使所有任务调度程序设置、权限等都是正确的,此错误代码也可能由实际 Powershell 脚本或批处理 (.bat) 文件中的错误/错误引起;在我的例子中,我引用了一个不存在的目录。
【讨论】:
【参考方案3】:我知道一个老问题,但我在 Windows 2016 服务器上收到 2147942401 错误。
如果您查看计划任务属性,在常规选项卡的底部,它默认为配置为:Windows Vista、Windows Server 2008。
换成Windows Server 2016,问题解决了。
【讨论】:
也可能是因为ps1文件的路径有空格。 ***.com/questions/45760457/… 你拯救了我的一天!在尝试了所有可能的解决方案、修复和解决方法之后,这个在 Microsoft Windows Server 2016 上运行。由于某种原因,它默认所有新创建的计划任务为最旧的可能“兼容模式”。如果计划任务是一个 PS 脚本,它依赖于 Windows Server 2008 时代不存在的功能......【参考方案4】:在此处抛出错误操作"powershell.exe" with return code 2147942401
的另一个常见原因。如果您的操作参数不正确,您也会收到此错误消息。
检查动作参数参数和参数值的间距是否正确。
好例子:
-executionpolicy bypass -file "C:\Scripts\ImportFiles.ps1"
破碎的例子('file'参数和它的值之间没有空格):
-executionpolicy bypass -file"C:\Scripts\ImportFiles.ps1"
【讨论】:
【参考方案5】:M Herbener 的回答导致我尝试手动运行脚本,以查看脚本是否有错误。它没有,但它确实突出了我收到错误消息时的问题:
无法加载[我的脚本],因为在此系统上禁用了运行脚本。
当然,解决方案是运行 Set-ExecutionPolicy 以允许 Powershell 脚本运行。
【讨论】:
【参考方案6】:对我来说,这项任务有时会奏效,有时却不会。根据 Scheduled Task History,失败时,它看起来好像已经运行了大约 40 秒,什么都不做,完成了action "C:\windows\SYSTEM32\cmd.exe" with return code 2147942401
。
在这种情况下,没有必要搞乱组策略设置,因为有时它会起作用。但不是每次。这意味着这是一个时机问题,而不是政策问题。
重新创建、重新配置我的任务(如this SuperUser Q&A 中的建议)并没有解决问题。
我确实也考虑过删除我的批处理文件并摆脱标准输出重定向,从而放弃日志记录功能(并且变得盲目)。或者只是运行一个实际的 "*.exe" 进程,而不是使用批处理文件。这可能是一个解决方案。
我还考虑用成熟的服务替换“启动时”计划任务,但对于这样一个微不足道的问题,这将是一项昂贵的实验。
最后,我记得服务可以延迟:“自动”与“自动(延迟启动)”。所以我通过在任务计划程序中添加计划任务的延迟来模仿这一点。对于“启动时”计划任务,触发器具有自己的单独属性,并且可以在此处配置延迟:
我相信我的计划任务有时启动得太早了几毫秒,并且某些操作系统服务或功能尚不可用或不允许使用。只需在触发器上添加一个小延迟即可解决问题。
【讨论】:
以上是关于计划任务中的批处理文件返回代码 2147942401的主要内容,如果未能解决你的问题,请参考以下文章