我正在编写一个简单的PS脚本来启动或停止我在Azure中托管的所有VM。顺序执行此操作需要永远,所以我将其设置为一个Job(即VM的每个Start / Stop都是一个单独的工作)。
现在脚本执行得更快,因为每个启动/停止操作都独立于另一个,但是如果我关闭PS shell窗口,作业显然会停止,并且不会在VM上执行操作。我想要的是某种“即发即忘”类型的动作,我可以在其中运行脚本,看到它已经开始执行作业,然后关闭我的笔记本电脑并打包。
即使PS窗口已关闭,PS中是否可以启动作业?
由于
答案 0 :(得分:1)
以下脚本作为远程计算机上的作业执行,在此示例中,它将时间写入远程计算机上的文件。
启动脚本后,我关闭本地PowerShell会话,脚本继续在远程计算机上执行,表明您确实需要。
$computername = "mycomputer"
$script = {
1..10 | %{
"$_ $(get-date)" | out-file -FilePath "c:\temp\time.txt" -Append
sleep 10
}
}
Invoke-Command -ComputerName $computername -ScriptBlock $script -AsJob
如果您将要在远程计算机中执行的代码放在脚本块中,则此操作将在远程计算机上运行,而无需保持本地会话处于活动状态。
答案 1 :(得分:0)
如果要在主进程完成后保持作业运行,则只需调用新的PowerShell进程即可。像这样的东西
Start-Process -FilePath 'powershell.exe' -ArgumentList '-command "& {gci c:\ -rec}"'
如果需要,可以使用-file命令行参数并指定将在单独的进程中执行的ps1。
答案 2 :(得分:0)
这可能并不能帮助所有人,但是我发现即使在窗口关闭后,将try {} finally {}
放在工作中也可以使代码在finally块中运行。
对于我的情况,我正在后台作业中删除一个文件夹,因此很容易拾取该删除并将其继续到finally块。
类似的东西:
Start-Job -ScriptBlock {
$Directory = "c:\temp"
try
{
del $Directory
}
finally
{
# If the window was closed, continue deleting here
if (Test-Path $Directory)
{
del $Directory
}
}
}
答案 3 :(得分:-1)
刚刚遇到同样的问题,在脚本的末尾添加一个循环..
do{ Start-Sleep 60 } until ((get-job).State -notcontains 'running')