Powershell:合并包括单个脚本

时间:2014-05-11 15:15:42

标签: powershell

我想将具有多个点源脚本的脚本/函数合并到单个ps1脚本/函数中。包含的每个脚本也可能有自己的包含等等。

===编辑===

我想你在SO上需要非常明显,所以让我举一个简单的例子:

first.ps1

. $PSScriptRoot\inc\second.ps1

"first"

second.ps1

"second"

假设存在接受主脚本并生成合并脚本的函数Merge

Merge first.ps1 first-merged.ps1

最终脚本将显示为:

第一merged.ps1

"second"
"first"

考虑到你可以用不同的方式点源,例如在一个循环中,这是徒劳的。

我认为“powershell reader”会在内部创建这样的东西,所以也许有办法获得它。

2 个答案:

答案 0 :(得分:2)

您正在寻找类似C预处理器的东西吗?也就是说,合并内容而不实际执行脚本,对吧? AFAIK PowerShell没有描述点源和脚本执行之间的界限。点源只是另一个命令。因此,您可以A)通过正则数据源的文件的正则表达式进行传递搜索,或者如果您需要进行挑战B)使用AST来帮助查找点源文件,例如:

(Get-Command .\first.ps1).ScriptBlock.Ast.EndBlock.Statements.PipelineElements  | Where InvocationOperator -eq Dot

输出:

CommandElements    : {$PSScriptRoot\second.ps1}
InvocationOperator : Dot
DefiningKeyword    :
DefinedKeywords    :
Redirections       : {}
Extent             : . $PSScriptRoot\second.ps1
Parent             : . $PSScriptRoot\second.ps1

当然,你必须追逐所有这些点源文件来对它们做同样的事情(以实现传递闭包)。但正如你所提到的,如果说路径包含一个你在运行时都不知道的变量,那么这可能具有挑战性。

答案 1 :(得分:-1)

你还没有在这里特别提出问题,但我认为你的意思是说"我该怎么做?#34;。这是一个非常简单的过程。

例如,从 Script1.ps1 (下面)我们可以通过简单的点源来访问 Script3.ps1 Script4.ps1 中的函数单个 Script2.ps1 ,其中包含这些引用。

<强> Script1.ps1

.$PSScriptRoot\Script2.ps1

Get-Script3Name
Get-Script4Name

<强> Script2.ps1

#dot source all the scripts you need access to
$PSScriptRoot\Script3.ps1
$PSScriptRoot\Script4.ps1

<强> Script3.ps1

Function Get-Script3Name
{
    "This is Script3"
}

<强> Script4.ps1

Function Get-Script4Name
{
    "This is Script4"
}

运行Script1.ps1时的结果

This is Script3
This is Script4

有关详细信息,我还建议您阅读此older post,其中提供了一些非常好的答案