2

我正在编写一个简单的 PS 脚本来启动或停止我在 Azure 中托管的所有 VM。依次执行此操作需要很长时间,因此我将其设置为一个作业(即 VM 的每个启动/停止都是一个单独的作业)。

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

即使PS窗口已关闭,这是否可以在PS中开始工作?

谢谢

4

4 回答 4

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

如果您将希望在远程计算机中执行的代码放在脚本块中,那么它将在远程计算机上运行,​​而无需保持本地会话处于活动状态。

于 2013-10-23T08:18:17.347 回答
0

如果要在主进程完成后保持作业运行,只需调用新的 powershell 进程即可。像这样的东西

Start-Process -FilePath 'powershell.exe' -ArgumentList '-command "& {gci c:\ -rec}"'

如果需要,您可以使用 -file 命令行参数并指定将在单独进程中执行的 ps1。

于 2017-05-02T23:49:19.283 回答
-1

只是遇到同样的问题,在脚本末尾添加一个循环..

do{  Start-Sleep 60  }  until ((get-job).State -notcontains 'running')
于 2017-05-02T02:22:37.473 回答
-1

它可能对每个人都没有帮助,但我发现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
        }
    }
}
于 2019-05-29T22:48:23.213 回答