如何在PowerShell Start-Job中导入脚本并调用公共代码?
问题解决:PowerShell Job中访问公共脚本的方法
PowerShell作业(Job)运行在独立的子进程中,主脚本里导入的模块、函数和变量不会自动共享到作业进程,需要手动在作业内部加载公共代码,或者把需要的内容传递进去。以下是两种可行的解决方法:
方法1:在作业脚本块内重新导入Constants.ps1
作业的工作目录通常和主脚本不同,因此必须使用绝对路径导入公共脚本。可以先在主脚本中计算好绝对路径,再传给作业:
# 主脚本中先获取Constants.ps1的绝对路径 $constantsPath = Resolve-Path $PSScriptRoot\..\..\Shared\Constants.ps1 $csv = Import-Csv "\\Shared\csvfile.csv" $RowList = $csv[$StartRow..$EndRow] Start-Job -ArgumentList $constantsPath, $RowList -ScriptBlock { PARAM ($constantsPath, $RowList) # 在作业内部导入公共脚本 . $constantsPath # 现在可直接访问SharePointUrl变量和UploadFile函数 Connect-PnPOnline -Url $SharePointUrl $RowList | ForEach-Object { UploadFile $_.FilePath $_.TargetUrl } }
方法2:传递变量和函数定义到作业
如果不想重复导入脚本,可以通过$using:传递变量,同时把函数定义转为字符串,在作业内重建函数:
# 主脚本中先导入公共脚本 . $PSScriptRoot\..\..\Shared\Constants.ps1 # 获取UploadFile函数的完整定义 $uploadFileFunctionDef = (Get-Command UploadFile).Definition $csv = Import-Csv "\\Shared\csvfile.csv" $RowList = $csv[$StartRow..$EndRow] Start-Job -ArgumentList $uploadFileFunctionDef, $RowList -ScriptBlock { PARAM ($uploadFileFunctionDef, $RowList) # 在作业内重建UploadFile函数 Invoke-Expression $uploadFileFunctionDef # 使用$using:获取主脚本中的SharePointUrl变量 Connect-PnPOnline -Url $using:SharePointUrl $RowList | ForEach-Object { UploadFile $_.FilePath $_.TargetUrl } }
额外注意
如果使用ForEach-Object -Parallel,它同样运行在独立的runspace中,若并行块内需要公共代码,也要在块内重复导入脚本或传递函数定义。
内容的提问来源于stack exchange,提问作者Mukesh
相关产品推荐
相关产品推荐

