完成后自动删除 PowerShell 作业(异步)

Pau*_*aul 6 powershell jobs powershell-cmdlet

我有一个 PowerShell cmdlet,用于简化通过 RDP 连接到另一台计算机的过程。

在该 cmdlet 中,我运行执行以下操作:

    if ($null -ne $Username -and $null -ne $Password) {
        Start-Process -FilePath "cmdkey.exe" -ArgumentList @("/generic:`"TERMSRV/$ComputerName`"", "/user:`"$Username`"", "/pass:`"$Password`"") -WindowStyle Hidden
    }

    Start-Job -ScriptBlock {
        param($InstallPath, $ComputerName, $Port, $Username, $Password)

        $arguments = @("`"$(Join-Path $InstallPath '\Support Files\MSTSC\Default.rdp')`"")
        if ($null -ne $Port) {
            $arguments += "/v:`"$($ComputerName):$($Port)`""
        } else {
            $arguments += "/v:`"$($ComputerName)`""
        }

        Start-Process -FilePath "mstsc.exe" -ArgumentList $arguments -Wait

        if ($null -ne $Username -and $null -ne $Password) {
            Start-Process -FilePath "cmdkey.exe" -ArgumentList @("/delete:`"TERMSRV/$ComputerName`"") -WindowStyle Hidden
        }
    } -ArgumentList @($InstallPath, $ComputerName, $Port, $Username, $Password)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我添加了用于连接到远程计算机的凭据,然后启动一个执行 mstsc.exe 的作业,等待它完成,然后删除凭据。

问题是我必须等待 mstsc 关闭才能删除凭据,否则它们会在 mstsc 有机会建立连接之前被删除,并且我希望此 cmdlet 是独立的 - 立即将控制权返回给用户命令提示符,这样我可以在我使用 RDP 会话时运行其他命令,这意味着我不能等待作业完成,因为这意味着我必须等待,直到与远程会话断开连接:

| Wait-Job | Remove-Job
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够在完成后删除作业,也许使用某种回调,这样我就不必在注销 RDP 会话和注销后手动运行另一个命令来清理作业作业不会处于已完成状态(这是我当前正在做的事情,但显然这不是“干净的”)。

对于完整的 cmdlet,您可以在此处查看更多上下文:

https://github.com/paulmarsy/Console/blob/master/AdvancedPowerShellConsole/Exports/Functions/Connect-Remote.ps1

The*_*ian 1

因此,注册一个计划作业在 5 分钟内运行,这将删除已完成的作业。我很确定你可以做类似的事情:

Register-ScheduledJob -ScriptBlock {param($computername); Wait-Job -Name $ComputerName|remove-job} -Trigger @{Frequency="Once";At=(get-date).AddMinutes(5).ToString("h:MM tt")} -argumentlist $computername
Run Code Online (Sandbox Code Playgroud)

然后,在执行 Start-Job 时,只需-Name $ComputerName在命令末尾附加一个名称即可为您的连接命名。这样,启动 5 分钟后,计划任务就会启动,按名称查找并清除该作业。