在 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
最佳答案
您必须执行函数定义才能使它们可用。没有其他办法了。
您可以尝试将 PowerShell 解析器扔到文件中,只执行函数定义而不执行其他任何操作,但我想更简单的方法是将可重用部分构建为模块或简单地构建为除了声明函数之外不做任何事情的脚本。
作为记录,一个粗略的测试脚本可以做到这一点:
$file = 'foo.ps1'
$tokens = @()
$errors = @()
$result = [System.Management.Automation.Language.Parser]::ParseFile($file, [ref]$tokens, [ref]$errors)
$tokens | %{$s=''; $braces = 0}{
if ($_.TokenFlags -eq 'Keyword' -and $_.Kind -eq 'Function') {
$inFunction = $true
}
if ($inFunction) { $s += $_.Text + ' ' }
if ($_.TokenFlags -eq 'ParseModeInvariant' -and $_.Kind -eq 'LCurly') {
$braces++
}
if ($_.TokenFlags -eq 'ParseModeInvariant' -and $_.Kind -eq 'RCurly') {
$braces--
if ($braces -eq 0) {
$inFunction = $false;
}
}
if (!$inFunction -and $s -ne '') {
$s
$s = ''
}
} | iex
如果脚本中声明的函数引用脚本参数(因为不包括脚本的参数 block ),您将遇到问题。可能还有很多我现在想不到的其他问题。我最好的建议仍然是区分可重用的库脚本和打算调用的脚本。
关于powershell - 点源脚本而不执行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991679/