我有一个函数,我应该能够从我的powershell脚本中的任何位置调用。
问题在于它在脚本块中没有识别函数。
在下面的示例中,我有函数 getNumberFive
,该函数应返回数字5。
当我启动新作业以及在脚本末尾,我希望能够在脚本块中使用此功能。
预期结果:
将编号 15 写入文件" C: tmp result.txt"
写入控制台:"我喜欢数字5"
实际上:
将编号 10 写入文件" C: tmp result.txt"
写入控制台:"我喜欢数字5"
我可以通过定义脚本键内的相同功能来解决此问题,但是我将复制该功能,这不是一个好的编程。
另一种方法是定义:
$func = {
function getNumberFive(){
return 5
}
}
$scriptBlock = {
Function printSum(){
$number = getNumberFive
$newNumber = 10 + $number # => $newNumber should be 15
$newNumber >> "C:tmpresult.txt"
}
}
Start-Job -ScriptBlock $scriptBlock -InitializationScript $func
但是在这种情况下,我将无法致电$five = getNumberFive
。
我读了数量的方法,但我不明白如何确切使用它们:
在同一脚本中定义的启动JOB脚本块中调用PowerShell函数
如何将命名函数作为参数(scriptblock)
传递https://social.technet.microsoft.com/forums/ie/en-us/485df2df-1577-477-4770-9db9-a9c5627ddd04a/= winserverpowershell
powershell:通行功能作为参数
在带有参数的函数上使用Invoke -Command -scriptBlock
我的脚本:
function getNumberFive(){
return 5
}
$scriptBlock = {
Function printSum(){
# $number = getNumberFive => DOESN'T WORK
# $number = Invoke-Expression ($(get-command getNumberFive) | Select -ExpandProperty Definition) => DOESN'T WORK AS EXPECTED
# $number = &(${function:getNumberFive}) => DOESN'T WORK AS EXPECTED
# $number = &(Get-Item function:getNumberFive) => DOESN'T WORK AS EXPECTED
$newNumber = 10 + $number # => $newNumber should be 15
$newNumber >> "C:tmpresult.txt"
}
printSum
}
Start-Job -ScriptBlock $scriptBlock
$five = getNumberFive
Write-Host "I like the number"$five
Get-Job | Wait-Job
Get-Job | Stop-Job
Get-Job | Remove-Job
将脚本块传递给 start-job
(或 invoke-expression
)执行该脚本block的powerShell实例只能访问该脚本键,脚本块加载的任何内容以及在PowerShell中已存在的任何内容实例。
不包括脚本的其他部分。(对于脚本中本地定义的函数,可以从其他远程删除powershell的实例可用整个脚本 - 不仅仅是脚本屏蔽 - 以及任何依赖项都需要从其他实例访问。)
)您可以在两个位置重构您想要的代码中的代码中脚本块加载以及创建脚本的作业。
使用作业时,您是在另一个过程中执行代码:像任何远程操作一样,远程执行是一个单独的环境。
您可以这样做:
function getNumberFive(){
return 5
}
$a={
Function printSum($number){
$newNumber = 10 + $number # => $newNumber should be 15
$newNumber >> "D:result.txt"
}
}
$scriptBlock = {
param($number)
printSum -number $number
}
$five = getNumberFive
Write-Host "I like the number"$five
Start-Job -InitializationScript $a -ScriptBlock $scriptBlock -ArgumentList $five
有一个开关名称 - initializationscript 在 start-job 中,您可以像函数一样保留初始化代码。将其包裹在脚本屏幕中,然后将其从主脚本块中调用。
希望它有帮助。