在PowerShell中是否可以在不执行脚本函数的情况下以某种方式进行点源代码或重用脚本函数?我尝试重用脚本的功能,而不执行脚本本身。我可以把函数分解成一个只包含函数的文件,但我尽量避免这样做。
- 点源文件示例:**
function doA
{
Write-Host "DoAMethod"
}
Write-Host "reuseme.ps1 main."
- 消耗文件示例:**
. ".\reuseme.ps1"
Write-Host "consume.ps1 main."
doA
- 执行结果:**
reuseme.ps1 main.
consume.ps1 main.
DoAMethod
- 期望结果:**
consume.ps1 main.
DoAMethod
5条答案
按热度按时间mwg9r5ms1#
您必须执行函数定义以使它们可用。这是没有办法的事。
你可以尝试在文件中抛出PowerShell解析器,只执行函数定义,但我想更简单的方法是将可重用部分构建为模块或简单地构建为除了声明函数之外不做任何事情的脚本。
为了记录在案,一个粗略的测试脚本可以做到这一点:
如果脚本中声明的函数引用脚本参数(因为脚本的参数块不包括在内),您将遇到问题。可能还有一大堆其他的问题会发生,我现在想不起来。我最好的建议仍然是区分可重用的库脚本和打算调用的脚本。
pwuypxnk2#
在你的函数后面,Write-Host "reuseme.ps1 main."行被称为"过程代码"(即,它不在函数内)。您可以通过将此过程代码 Package 在IF语句中来告诉脚本不要运行此过程代码,该IF语句计算$MyInvocation.InvocationName-ne "."
$MyInvocation.InvocationName查看脚本是如何被调用的,如果您使用点(.)来点源化脚本,它将忽略过程代码。如果运行/调用脚本时不带点(.),则它将执行过程代码。示例如下:
因此,当您正常运行脚本时,您将看到输出。当您点源化脚本时,您将看不到输出;但是,函数(而不是过程代码)将被添加到当前范围。
cidc1ykv3#
重用代码的最佳方法是将函数放在PowerShell模块中。只需创建一个包含所有函数的文件,并将其扩展名设置为
.psm1
。然后导入模块以使所有功能可用。例如,reuseme.psm1
:然后,在任何脚本中,你想使用你的函数模块,
z4iuyo4d4#
在进一步寻找这个问题的解决方案时,我发现了一个解决方案,它几乎是Aaron回答中提示的后续。意图有点不同,但可以用来达到同样的结果。
这是我的发现:https://virtualengine.co.uk/2015/testing-private-functions-with-pester/
在使用Pester进行一些测试时需要它,我希望避免在为逻辑编写任何测试之前更改文件的结构。
它工作得很好,让我有信心在重构文件结构之前先为逻辑编写一些测试,这样我就不必再对函数进行点源化。
Get-FunctionDefinition
的代码ct2axkht5#
下面是一个简单的方法,将函数从另一个文件导入到当前范围,而不执行该文件。在使用Pester进行单元测试时非常有用。
这是通过直接调用PowerShell解析器来实现的,就像前面的答案一样。
Answer的灵感来自于这条线索:Is there a way to show all functions in a PowerShell script?