假设我有一个调用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。
答案 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