执行“ while” ASNYC函数中的循环

发布于 2025-01-23 23:42:57 字数 3057 浏览 2 评论 0原文

我绝对觉得我已经尽力解决这个问题了,所以当我试图解释我想完成的工作时,请忍受我。

我有一个PowerShell脚本,可以自动化许多不同的卸货任务。其中一些任务可能需要一段时间。例如,等待电子邮件出口到完成可能需要数小时,具体取决于员工及其在公司的时间长度。因此,我没有在脚本本身中执行我的“ while”循环(并记录所有接下来的步骤),而是试图将其传递给异步函数,以在后台运行,而我的其余我的卸货脚本则移动。

我可以说,异步函数成功运行,并且正在通过所需的变量,但是...什么也没有发生。我没有打印到日志文件的更新。我没有对SQL DB中的条目进行更新。我真的很茫然。

这是在主脚本中对我函数的调用:

$VaultParameters = @{
    employee_name = "$employee_name"
    export_name = "$export_name"
    sql_id = "$sql_id"
    vault_status_id = "$vault_status_id"
}
VaultExport @VaultParameters

这是功能本身:

function VaultExport {
    param (
        [cmdletbinding()]
        [parameter()]
        [string]$employee_name,
        [parameter()]
        [string]$export_name,
        [parameter()]
        [string]$sql_id,
        [parameter()]
        [string]$vault_status_id
    )

    $scriptBlock = {
        param ($employee_name,$export_name,$sql_id,$vault_status_id)
        $vault_ready = "no"
        while ($vault_ready -eq "no") {
            $vault_status = gam info export "Email Exports" "$export_name"
            $vault_status = $vault_status -Match "COMPLETED"
            $vault_status = $vault_status -split(": ")
            $vault_status = $vault_status[1]
            Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_status`` = '$vault_status' WHERE ``id`` = '$vault_status_id'"
            if ($vault_status -eq "COMPLETED") {
                $vault_ready = "yes"
                $completed = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_completed`` = '$completed' WHERE ``id`` = '$vault_status_id'"
                Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_status`` = '1' WHERE ``id`` = '$sql_id'"
                $LoggingParameters = @{
                    logfile = "C:\script_logs\threxit.log"
                    log = "INFO: (GVEF, $employee_name) $export_name is ready ($vault_status). Downloading now..."
                }
                EventLogging @LoggingParameters
                Write-Output "$export_name is ready ($vault_status). Downloading now..."
            } else {
                $vault_status = gam info export "Email Exports" "$export_name"
                $vault_status = $vault_status -Match "IN_PROGRESS"
                $vault_status = $vault_status -split(": ")
                $vault_status = $vault_status[1]
                $LoggingParameters = @{
                    logfile = "C:\script_logs\threxit.log"
                    log = "INFO: (GVEF, $employee_name) $export_name is not yet ready ($vault_status). Checking again in ten seconds."
                }
                EventLogging @LoggingParameters
                Write-Output "$export_name is not yet ready ($vault_status). Checking again in ten seconds."
                Start-Sleep 10
            }
        }
    }
    Start-Job -ScriptBlock $scriptBlock -ArgumentList @($employee_name,$export_name,$sql_id,$vault_status_id)
}
exit

I definitely feel like I've done my due diligence in trying to sort this one out, so bear with me as I try to explain what I'd like to accomplish.

I have a PowerShell script that automates many different offboarding tasks. Some of these tasks can take quite some time. For example, waiting on an e-mail export to complete can take hours depending on the employee and their length of time with the company. So, rather than performing my "while" loop in the script itself (and log jamming all of the next steps) I am trying to pass it off to an async function to run in the background while the rest of my offboarding script moves along.

I can tell that the async function successfully runs and the required variables are being passed, but... nothing is happening. I'm getting no updates printed to my log file. I'm getting no updates to the entry in my SQL db. I'm truly at a loss with this one.

Here is the call to my function in the main script:

$VaultParameters = @{
    employee_name = "$employee_name"
    export_name = "$export_name"
    sql_id = "$sql_id"
    vault_status_id = "$vault_status_id"
}
VaultExport @VaultParameters

And here is the function itself:

function VaultExport {
    param (
        [cmdletbinding()]
        [parameter()]
        [string]$employee_name,
        [parameter()]
        [string]$export_name,
        [parameter()]
        [string]$sql_id,
        [parameter()]
        [string]$vault_status_id
    )

    $scriptBlock = {
        param ($employee_name,$export_name,$sql_id,$vault_status_id)
        $vault_ready = "no"
        while ($vault_ready -eq "no") {
            $vault_status = gam info export "Email Exports" "$export_name"
            $vault_status = $vault_status -Match "COMPLETED"
            $vault_status = $vault_status -split(": ")
            $vault_status = $vault_status[1]
            Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_status`` = '$vault_status' WHERE ``id`` = '$vault_status_id'"
            if ($vault_status -eq "COMPLETED") {
                $vault_ready = "yes"
                $completed = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_completed`` = '$completed' WHERE ``id`` = '$vault_status_id'"
                Invoke-SqlUpdate -Query "UPDATE ``db_name``.``table_name`` SET ``vault_status`` = '1' WHERE ``id`` = '$sql_id'"
                $LoggingParameters = @{
                    logfile = "C:\script_logs\threxit.log"
                    log = "INFO: (GVEF, $employee_name) $export_name is ready ($vault_status). Downloading now..."
                }
                EventLogging @LoggingParameters
                Write-Output "$export_name is ready ($vault_status). Downloading now..."
            } else {
                $vault_status = gam info export "Email Exports" "$export_name"
                $vault_status = $vault_status -Match "IN_PROGRESS"
                $vault_status = $vault_status -split(": ")
                $vault_status = $vault_status[1]
                $LoggingParameters = @{
                    logfile = "C:\script_logs\threxit.log"
                    log = "INFO: (GVEF, $employee_name) $export_name is not yet ready ($vault_status). Checking again in ten seconds."
                }
                EventLogging @LoggingParameters
                Write-Output "$export_name is not yet ready ($vault_status). Checking again in ten seconds."
                Start-Sleep 10
            }
        }
    }
    Start-Job -ScriptBlock $scriptBlock -ArgumentList @($employee_name,$export_name,$sql_id,$vault_status_id)
}
exit

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文