我正在尝试从任务计划程序运行一个简单的 PS1 powershell 脚本。该任务的操作设置为Program: powershell
和Add arguments: -executionpolicy bypass -file C:\Users\Robin\Documents\script.PS1
。
目标 script.PS1 可以正常访问,但其中的一行(对另一个脚本的调用Rscript Z:\rscript.R
:)失败,并显示以下消息:
Fatal error: cannot open file Rscript Z:\rscript.R
'rscript.R': no such file or directory
如果我在 Powershell 中手动运行同一行,它就可以正常工作。此外,以下命令作为运行命令运行良好:powershell -executionpolicy bypass -file C:\Users\Robin\Documents\script.PS1
,这表明问题出在任务计划程序中。该任务设置为以最高权限运行。我被难住了。
非常感谢您的帮助。
答案1
我假设 Z:是一个网络驱动器。
计划作业(通常)在系统帐户下运行。网络驱动器通常不会为系统映射。即使您将其更改为在您的凭据(或任何特定用户凭据)下运行,您也不能指望网络共享可以访问。您需要:
- 使用 UNC 路径运行第二个脚本(并确保系统帐户有权访问 UNC 路径)
- 在脚本的早期阶段映射网络驱动器(在 PowerShell 3 中,您可以使用 New-PSDrive,但最简单的方法是运行该
NET USE Z: \\SERVER\SHARE
命令。当然,您可能需要添加用户凭据:password /USER:domain\user
您也可以尝试添加/SAVECRED /PERSISTENT:YES
并运行该命令一次,并希望它能成功(但如果可以的话,我仍然会测试路径并重新映射它)。 - 最安全的选择:在本地复制该文件。
答案2
请从 stackoverflow 检查一下这个,看起来非常类似的情况: 我如何才能让 powershell (通过任务计划程序运行) 找到我的网络驱动器?
答案3
您从批处理文件中尝试的命令是错误的。
尝试此命令,并记得保留引号。
powershell.exe -file ". 'C:\Users\Robin\Documents\script.ps1'"
答案4
尽管您可能已经找到了解决问题的方法,但我仍将发布此说明以造福其他人。我遇到了类似的问题。我基本上使用了不同的域帐户进行测试和比较。选中“无论用户是否登录都运行”后,任务运行正常。
需要记住并确保以下几点:
- 用于执行任务的帐户必须在服务器的本地安全策略下具有“以批处理作业登录”权限(或属于本地管理员组的成员)。您必须指定运行脚本/批处理文件所需的帐户。
- 确保输入正确的密码字符
- 2008 R2 中的任务不会以交互方式运行,特别是如果您以“无论用户是否登录都运行”的方式运行它们。这很可能会失败,特别是如果您在脚本上寻找任何特定于创建任务时用户配置文件的对象\资源,因为 powershell 会话将需要该信息才能启动,否则它将启动并立即结束。例如,在运行脚本时将 $Path 定义为“无论用户是否登录都运行”,我指定了一个映射驱动器。它会在任务启动时寻找该驱动器,但由于验证运行任务的用户帐户未登录,并且在脚本上您引用回它需要处理的源\对象不存在,任务将终止。映射驱动器 (\server\share) x:\ vs. 实际 UNC 路径 \server\share
- 检查您的步骤、脚本和参数。有时,即使您已多次执行此过程,最小的部分也会产生很大的影响。我在输入密码时多次漏掉了一个字符,在构建脚本或任务时有时漏掉了一个分号。
检查提供的链接,希望您或其他人可以从此信息中受益。注意安全。
https://technet.microsoft.com/en-us/library/cc722152.aspx