当使用runas或计划任务打开的命令提示符启动脚本时,Start-Process -wait无法正常工作。

12
我有一个脚本想要作为定时任务运行,但它没有执行它应该执行的操作。我试图使用Start-Process调用可执行文件,并在继续之前使用-Wait开关等待。命令是:
Start-Process -FilePath "C:\Pfx Engagement\Admin\Utilities\Backup Restore\BackupRestoreUtil.exe" -ArgumentList "/f "$backup_directory"" -Wait
如果我从命令提示符中调用它,即: powershell .\script.ps1
它可以工作。它运行该命令并在继续之前等待其完成。在此命令完成后,必须运行脚本的其他内容。问题是,在定时任务上运行时它不等待。进行一些基本故障排除后,我首先尝试使用计划任务帐户(名为“Scripts”)打开带有runas的cmd窗口。所以我运行
runas /env /user:Scripts cmd
以使用任务帐户打开一个命令提示符窗口。从该命令提示符中,我再次尝试了“powershell .\script.ps1”,但这次没有等待。它运行该命令并在命令完成之前立即移动到下一步。因此,我认为它可能是“Scripts”帐户的问题,直到我使用runas Administrator打开新的命令提示符时。
runas /env /user:Administrator cmd
当我从此管理员命令提示符调用脚本时,“-Wait”开关也被忽略,并且在调用它后立即运行脚本而无需等待其完成。
奇怪的部分是,当我不使用runas从管理帐户的命令提示符中调用它时,它能够工作。同一个帐户,两种不同的结果。对于这里发生的事情有任何想法,非常重要的是如何解决?
操作系统是Server 2008 R2,运行PowerShell 3.0。

在将 PS 2 升级到 3 后,我遇到了同样的问题。在 PS 版本 2 中,等待功能完美运行!等待进程完成的解决方法有一个巨大的问题 - 它不会返回进程的 .ExitCode。 - Ivan
1个回答

11

我无法告诉你为什么会这样,但我认为这可能可以解决它:

$proc = Start-Process -FilePath "C:\Pfx Engagement\Admin\Utilities\Backup Restore\BackupRestoreUtil.exe" -ArgumentList "/f "$backup_directory"" -Passthru
do {start-sleep -Milliseconds 500}
until ($proc.HasExited)

-Passthru开关将使其返回进程的Process对象,您可以测试该对象以查看进程何时退出。


那对于“runas”测试起了作用。我猜明天早上我会知道它是否在任务计划程序中起作用。 - user3137716
你已经禁用了执行策略吗?在运行PowerShell时,始终添加-executionpolicy开关,而不是依赖于本地帐户策略设置。 - Stephen Connolly
如果是执行策略问题,该命令根本无法运行。 - user3137716
今天早上发现脚本作为计划任务完美执行。谢谢! - user3137716
这种方法存在问题 - $proc.ExitCode 不可用。 - Ivan
4
顺便提一下,你可以使用 $proc.WaitForExit() 而不是 Start-Sleep。但它仍然无法设置 $proc.ExitCode。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接