执行“ while” ASNYC函数中的循环
我绝对觉得我已经尽力解决这个问题了,所以当我试图解释我想完成的工作时,请忍受我。
我有一个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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论