2013-08-01 82 views
1

在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 
+0

正在修改原来的脚本(一个你想导入的功能)的选项?只有当它不是点源时,才可以修改它以执行其余的代码。 – Poorkenny

+0

不是 - 那也是我的第一个想法。 – Frederik

+0

你为什么试图避免执行该文件? –

回答

7

执行函数定义,以使它们可用。没有其他办法了。

你可以尝试在文件中抛出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 

你会出现问题,如果在脚本参考脚本参数声明的函数(如不包括脚本的参数块)。而且可能会出现一大堆其他问题,我现在无法想到。我最好的建议仍然是区分可重用的库脚本和意图被调用的脚本。

+1

我不会沿着描述的解析路线走,它看起来像是一堆蠕虫。我希望我错过了一个窍门。 – Frederik

2

重用代码的最佳方法是将你的函数放在PowerShell模块中。只需创建一个包含您所有功能的文件,并为其添加.psm1扩展名。然后导入模块以使所有功能可用。例如,reuseme.psm1

function doA 
{ 
    Write-Host "DoAMethod" 
} 

Write-Host "reuseme.ps1 main." 

然后,在你想使用的功能模块任何脚本,

# If you're using PowerShell 2, you have to set $PSScriptRoot yourself: 
# $PSScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition 
Import-Module -Name (Join-Path $PSScriptRoot reuseme.psm1 -Resolve) 

doA 
+0

在执行“doA”之前执行“Write-Host”reuseme.ps1 main。“ - 这正是我试图避免的。 – Frederik

相关问题