gpt4 book ai didi

function - 如何在脚本 block 外调用函数

转载 作者:行者123 更新时间:2023-12-04 07:40:43 26 4
gpt4 key购买 nike

我有一个函数,我应该能够从我的 powershell 脚本中的任何地方调用它。

问题是它没有识别脚本 block 中的函数。

在下面的示例中,我有函数 getNumberFive,它应该返回数字 5。
我希望能够在开始新工作时以及脚本末尾时在脚本 block 中使用此函数。

预期结果:
将数字15写入文件“C:\tmp\result.txt”
向控制台写入:“我喜欢数字 5”

现实中:
将数字10写入文件“C:\tmp\result.txt”
向控制台写入:“我喜欢数字 5”

我可以通过在脚本 block 中定义相同的函数来解决这个问题,但随后我将复制该函数,这不是一个好的编程。

另一种方式是定义:

$func = {
function getNumberFive(){
return 5
}
}
$scriptBlock = {

Function printSum(){
$number = getNumberFive
$newNumber = 10 + $number # => $newNumber should be 15
$newNumber >> "C:\tmp\result.txt"
}
}
Start-Job -ScriptBlock $scriptBlock -InitializationScript $func

但在这种情况下,我将无法调用 $five = getNumberFive

我阅读了很多方法,但我不明白如何使用它们:
CALLING A POWERSHELL FUNCTION IN A START-JOB SCRIPT BLOCK WHEN IT’S DEFINED IN THE SAME SCRIPT

How to pass a named function as a parameter (scriptblock)

https://social.technet.microsoft.com/Forums/ie/en-US/485df2df-1577-4770-9db9-a9c5627dd04a/how-to-pass-a-function-to-a-scriptblock?forum=winserverpowershell

PowerShell: Pass function as a parameter

Using Invoke-Command -ScriptBlock on a function with arguments

我的脚本:

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:\tmp\result.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

最佳答案

当您将脚本 block 传递给 start-job(或 invoke-expression)时,执行该脚本 block 的 PowerShell 实例只能访问该脚本 block ,任何脚本 block 加载,以及 PowerShell 实例中已存在的任何内容。

脚本的其他部分不包括在内。 (要使脚本中本地定义的函数可从 PowerShell 的其他实例(可能是远程实例)访问,则整个脚本——而不仅仅是脚本 block ——以及任何依赖项都需要可从其他实例访问。)

您可以在这两个地方将您想要的代码重构到脚本 block 加载的模块以及作业创建脚本中。

使用作业时,您正在另一个进程中执行代码:与任何远程操作一样,远程执行是一个单独的环境。

关于function - 如何在脚本 block 外调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com