无法通过任务计划程序恢复工作流
Unable to resume a workflow via task scheduler
在 powershell 中 window 我 运行 以下工作流程:
workflow foo { Suspend-Workflow; "hello world" | Out-File c:\users\weijgerss\desktop\foo.txt }
然后为了恢复工作流程,我在启动时通过任务调度程序安排了以下任务 运行:
Import-Module PSWorkflow
$jobs = Get-Job -state Suspended
$jobs > c:\users\weijgerss\desktop\zqqfff.txt
$resumedJobs = $jobs | resume-job -wait
$resumedJobs | wait-job
# Task scheduler action: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\users\weijgerss\desktop\resume.ps1'"
工作流不会在启动时恢复,如果我通过任务计划程序手动触发它也不会。 zqqfff.txt的内容表示任务调度器激活的powershell看不到工作流。当我 运行 Get-Job.
时,常规 powershell window 可以看到工作流程
(普通 powershell window 和任务调度程序 powershell 实例 运行 都是同一用户。)
我使用 procmon 查看发生了什么,从中我可以看出,当 powershell 通常与 taskscheduler 相比时,它正在查看不同的工作流持久性路径,即:
C:\Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL(一个普通的 powershell window 使用这个文件夹)
C:\Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL_NI(任务调度程序激活的 powershell 实例使用此文件夹)
我完全被难住了。如何让任务调度程序激活 powershell 实例以查看与普通 powershell 相同的工作流程 window?
以下脚本为您提供了一个解决方案,可以在 reboot/crash 在系统启动时使用任务计划程序后自动恢复 powershell 工作流程:
resume-workflows.ps1:(下面第一行修复问题中提到的_NI问题)
[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true
Import-Module PSWorkflow
Get-Job -State Suspended | Resume-Job -Wait| Wait-Job
resume-workflows.cmd:(解决 windows 8/server 2012 任务调度程序错误)
@rem This is a workaround for task scheduler bug
@rem See: http://support.microsoft.com/kb/2968540
set "USERPROFILE=%USERPROFILE%\..\%USERNAME%"
set "APPDATA=%USERPROFILE%\AppData\Roaming"
set "LOCALAPPDATA=%USERPROFILE%\AppData\Local"
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NonInteractive -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\path\to\resume-workflows.ps1'"
要将它们放在一起,请使用以下 powershell 脚本在系统启动时安排 resume-workflows.cmd 到 运行:
$trigger = New-ScheduledTaskTrigger -AtStartup
$action = New-ScheduledTaskAction -Execute "c:\path\to\resume-workflows.cmd"
$currentuser = ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Register-ScheduledTask -TaskName "Resume $($currentuser.Replace('\', '-'))'s Powershell Workflows" `
-Trigger $trigger -Action $action -RunLevel Highest -User $currentuser `
-Password (Read-Host "Enter password for $currentuser")
尽情享受吧!
(ILSpy、sysinternal 的 procmon、大量 google 和一些 windbg 都有助于为您提供上述答案)
在 powershell 中 window 我 运行 以下工作流程:
workflow foo { Suspend-Workflow; "hello world" | Out-File c:\users\weijgerss\desktop\foo.txt }
然后为了恢复工作流程,我在启动时通过任务调度程序安排了以下任务 运行:
Import-Module PSWorkflow
$jobs = Get-Job -state Suspended
$jobs > c:\users\weijgerss\desktop\zqqfff.txt
$resumedJobs = $jobs | resume-job -wait
$resumedJobs | wait-job
# Task scheduler action: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\users\weijgerss\desktop\resume.ps1'"
工作流不会在启动时恢复,如果我通过任务计划程序手动触发它也不会。 zqqfff.txt的内容表示任务调度器激活的powershell看不到工作流。当我 运行 Get-Job.
时,常规 powershell window 可以看到工作流程(普通 powershell window 和任务调度程序 powershell 实例 运行 都是同一用户。)
我使用 procmon 查看发生了什么,从中我可以看出,当 powershell 通常与 taskscheduler 相比时,它正在查看不同的工作流持久性路径,即:
C:\Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL(一个普通的 powershell window 使用这个文件夹) C:\Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL_NI(任务调度程序激活的 powershell 实例使用此文件夹)
我完全被难住了。如何让任务调度程序激活 powershell 实例以查看与普通 powershell 相同的工作流程 window?
以下脚本为您提供了一个解决方案,可以在 reboot/crash 在系统启动时使用任务计划程序后自动恢复 powershell 工作流程:
resume-workflows.ps1:(下面第一行修复问题中提到的_NI问题)
[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true
Import-Module PSWorkflow
Get-Job -State Suspended | Resume-Job -Wait| Wait-Job
resume-workflows.cmd:(解决 windows 8/server 2012 任务调度程序错误)
@rem This is a workaround for task scheduler bug
@rem See: http://support.microsoft.com/kb/2968540
set "USERPROFILE=%USERPROFILE%\..\%USERNAME%"
set "APPDATA=%USERPROFILE%\AppData\Roaming"
set "LOCALAPPDATA=%USERPROFILE%\AppData\Local"
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NonInteractive -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\path\to\resume-workflows.ps1'"
要将它们放在一起,请使用以下 powershell 脚本在系统启动时安排 resume-workflows.cmd 到 运行:
$trigger = New-ScheduledTaskTrigger -AtStartup
$action = New-ScheduledTaskAction -Execute "c:\path\to\resume-workflows.cmd"
$currentuser = ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Register-ScheduledTask -TaskName "Resume $($currentuser.Replace('\', '-'))'s Powershell Workflows" `
-Trigger $trigger -Action $action -RunLevel Highest -User $currentuser `
-Password (Read-Host "Enter password for $currentuser")
尽情享受吧!
(ILSpy、sysinternal 的 procmon、大量 google 和一些 windbg 都有助于为您提供上述答案)