我想将具有多个点源脚本的脚本/函数合并到单个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”会在内部创建这样的东西,所以也许有办法获得它。
答案 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,其中提供了一些非常好的答案