如何在设定的时间后从另一个PS脚本触发,而不会阻止执行

时间:2016-07-19 23:08:28

标签: powershell release-management

假设我有一个调用A.ps1的文件B.ps1

& "B.ps1"

我希望B.ps1的内容在N秒后运行,而不会阻止A.ps1。在这种情况下,A.ps1将立即完成,然后B.ps1的内容将在设定的时间后运行。

如何实现这一目标?

上下文

我们正在利用Release Management来部署带有PowerShell脚本的版本。有时RM会将我们需要的日志记录数据输出到IR_ProcessAutoOutput文件中 - 但这只会在RM完成后生成。因此,我希望将“GetLogs”脚本的执行推迟约20秒而不会阻塞,允许RM在此期间完成并生成IR_ProcessAutoOutput。

2 个答案:

答案 0 :(得分:2)

使用Start-Process代替呼叫运营商。

Start-Process 'powershell.exe' -ArgumentList '-File', 'B.ps1'

如果您不希望进程在其他窗口中运行,请添加参数-NoNewWindow

您还可以将第二个脚本作为background job运行:

Start-Job -Scriptblock { & 'B.ps1' }

如果您希望{<1}}在 B.ps1已经终止后启动,则需要创建计划任务。或者在A.ps1开头添加延迟:

B.ps1

答案 1 :(得分:2)

正如Ansgar所建议的,Start-Process的替代方案是安排任务。

确保任务在执行后自动删除

# A.ps1 doing its thing, and then:
$DelayInSeconds = 5
$SchTaskProperties = @{
    # Invoke powershell.exe -WindowStyle Hidden -File B.ps1
    Action   = New-ScheduledTaskAction -Id 0 -Execute powershell -Argument "-WindowStyle Hidden -File B.ps1" -WorkingDirectory 'C:\path\to\scripts'
    # Let it trigger in 5 seconds
    Trigger  = New-ScheduledTaskTrigger -At $([datetime]::Now.AddSeconds($DelayInSeconds)) -Once
    # Set task to be deleted after expiration, see below
    Settings = New-ScheduledTaskSettingsSet -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0)
    # Make up unique task name
    TaskName = "MyTask $([guid]::NewGuid())"
}
# Give the Trigger an EndBoundary (2 minutes later) to make sure it expires and is deleted
$SchTaskProperties['Trigger'].EndBoundary = [datetime]::UtcNow.AddMinutes(2).ToString('s') + 'Z'

# Register the task    
Register-ScheduledTask @SchTaskProperties |Out-Null
# Do whatever else A.ps1 needs to