使用 start-job 作为后台作业启动功能
Start function as a background job with start-job
我正在尝试使用 start-job 启动一个函数。
出于某种原因,我无法让它工作,全局变量不会通过。
我的问题是 - 如何将全局变量传递给函数,而不是在不在函数内部声明它们的情况下传递给 start-job。
函数示例:
$OutputDirectory=c:\test
$zipfile="c:.zip"
function 7zipextraction
{
Set-Alias 7zip zip_path
# Extracting files
$extract = 7zip x -y $zipfile -o"$OutputDirectory"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
开始工作的例子:
Start-Job -ScriptBlock ${Function:7zipextraction} | Wait-Job | Receive-Job
Start-Job
将作业分派给 一个单独的子进程 ,这就是它无法访问您在调用进程中定义的变量的原因。
参数化函数中的所有变量,然后将适当的参数显式传递给Start-Job -ArgumentList
:
function 7zipextraction
{
param(
[string]$ZipFile,
[string]$OutputDirectory,
[string]zipPath
)
Set-Alias 7zip zipPath -Force
# Extracting files
$extract = 7zip x -y $zipfile -o"$OutputDirectory"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
Start-Job -ScriptBlock ${Function:7zipextraction} -ArgumentList "c:.zip","c:\test","c:\path\tozipz.exe" | Wait-Job | Receive-Job
您可以使用 using:
修饰符来访问脚本块之外的变量:
$OutputDirectory='c:\test'
$zipfile='c:.zip'
zippath = 'C:\path\tozip'
function 7zipextraction
{
Set-Alias 7zip $using:7zippath
# Extracting files
$extract = 7zip x -y $using:zipfile -o"${using:OutputDirectory}"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
Start-Job -ScriptBlock ${Function:7zipextraction} | Receive-Job -Wait -AutoRemoveJob
using
适用于在远程计算机或不同线程中执行的脚本块:
- 调用命令
- 开始工作
- 开始线程作业
- ForEach-Object -Parallel
我正在尝试使用 start-job 启动一个函数。 出于某种原因,我无法让它工作,全局变量不会通过。 我的问题是 - 如何将全局变量传递给函数,而不是在不在函数内部声明它们的情况下传递给 start-job。 函数示例:
$OutputDirectory=c:\test
$zipfile="c:.zip"
function 7zipextraction
{
Set-Alias 7zip zip_path
# Extracting files
$extract = 7zip x -y $zipfile -o"$OutputDirectory"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
开始工作的例子:
Start-Job -ScriptBlock ${Function:7zipextraction} | Wait-Job | Receive-Job
Start-Job
将作业分派给 一个单独的子进程 ,这就是它无法访问您在调用进程中定义的变量的原因。
参数化函数中的所有变量,然后将适当的参数显式传递给Start-Job -ArgumentList
:
function 7zipextraction
{
param(
[string]$ZipFile,
[string]$OutputDirectory,
[string]zipPath
)
Set-Alias 7zip zipPath -Force
# Extracting files
$extract = 7zip x -y $zipfile -o"$OutputDirectory"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
Start-Job -ScriptBlock ${Function:7zipextraction} -ArgumentList "c:.zip","c:\test","c:\path\tozipz.exe" | Wait-Job | Receive-Job
您可以使用 using:
修饰符来访问脚本块之外的变量:
$OutputDirectory='c:\test'
$zipfile='c:.zip'
zippath = 'C:\path\tozip'
function 7zipextraction
{
Set-Alias 7zip $using:7zippath
# Extracting files
$extract = 7zip x -y $using:zipfile -o"${using:OutputDirectory}"
if ($LASTEXITCODE -ne 0)
{
write-host "7zip Error"
return
}
else
{
write-host "Files extracted successfully"
}
Start-Sleep -s 2
}
Start-Job -ScriptBlock ${Function:7zipextraction} | Receive-Job -Wait -AutoRemoveJob
using
适用于在远程计算机或不同线程中执行的脚本块:
- 调用命令
- 开始工作
- 开始线程作业
- ForEach-Object -Parallel