即使在shell窗口关闭后也能保持作业运行

时间:2013-10-23 07:31:37

标签: powershell

我正在编写一个简单的PS脚本来启动或停止我在Azure中托管的所有VM。顺序执行此操作需要永远,所以我将其设置为一个Job(即VM的每个Start / Stop都是一个单独的工作)。

现在脚本执行得更快,因为每个启动/停止操作都独立于另一个,但是如果我关闭PS shell窗口,作业显然会停止,并且不会在VM上执行操作。我想要的是某种“即发即忘”类型的动作,我可以在其中运行脚本,看到它已经开始执行作业,然后关闭我的笔记本电脑并打包。

即使PS窗口已关闭,PS中是否可以启动作业?

由于

4 个答案:

答案 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')