【发布时间】:2018-02-26 17:51:04
【问题描述】:
我有一个函数,我应该可以从我的 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:\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)
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
【问题讨论】:
-
试试
-InitializationScript $function:getNumberFive -
@TheIncorrigible1 它不起作用。我也试过了,在我的问题中通过在单独的脚本块中声明
getNumberFive来查看,但是I like the number 5不起作用。
标签: function powershell scriptblock