如何创建PowerShell"主"功能?

Bry*_*ley 9 powershell

我过去使用过很多脚本语言,现在正在学习PowerShell.在这些其他语言中,我通常在定义函数之前定义我的主要逻辑,因此阅读代码的人将首先关注主逻辑.这通常采用在文件顶部创建"主"函数或类的形式,并在底部调用它.

在PowerShell中,此模式可能如下所示:

$main = {
    ...
    do-something
    ...
}
function do-something() {
    <function definition here>
}

& $main
Run Code Online (Sandbox Code Playgroud)

这很好用,但我现在想利用PowerShell远程运行代码的能力.既然$main是PowerShell ScriptBlock对象,我[想我]可以在这样的远程机器上运行该代码:

Invoke-Command -ScriptBlock $main -ComputerName whatever;
Run Code Online (Sandbox Code Playgroud)

但是,远程机器对我的功能一无所知,因为它的定义超出了范围$main.当然,我可以将函数的定义移到$ main中,但是我必须把它放在主逻辑之上,我才回到第一个问题.

是否存在编写PowerShell脚本的通用模式,其中主逻辑位于文件顶部的函数或脚本块中,类似于许多传统语言?人们如何编写复杂的脚本 - 他们是否总是从上到下编写它们,根据需要在顶部填充函数?

有人将此标记为问题的可能副本为什么我需要首先在我的Powershell脚本中编写函数?.这不是重复的.我知道为什么需要首先定义函数 - 我一直在编程,因为C是很酷的新语言.

我要求的是在poweshell中这样做的模式,特别是在希望能够远程运行主代码的情况下.

是否存在将main块放在powershell脚本顶部的通用模式?Powershell语法和习语与更传统的语言,甚至是许多流行的现代脚本语言都有很大的不同,将主要逻辑移到顶端的模式并不明显(或者可能是这样,但我还没有找到正确的例子)或文件)

mjo*_*nor 9

如果你想仿效PowerShell中的"传统"的结构,要做到这一点的方法之一是使用Begin,ProcessEnd关键字.

这些可以在脚本中以任何顺序出现,但是Begin块将始终首先运行,因此您可以将其放在脚本的底部,并将函数定义放在那里,并将主逻辑放在脚本的顶部ProcessEnd阻止.


Fro*_* F. 7

脚本从顶部到底部读取,因此在启动之前不能使用任何引用.但是,您可以创建一个脚本/脚本块来模拟编程语言的工作方式.

在像c#这样的编程语言中,该main部分是一个函数.当应用程序完成加载必要的部分(如核心功能等),并且事件处理程序调用主函数以启动聚会.使用下面的方法,您将模拟相同的行为.

使用脚本块调用Invoke-Command

要使用它invoke-command,只需将上面的示例包装在新的scriptblock中并使用它.

$script = {
    #Main-function
    function main {
        #starting helper function
        helper-func
    }

    #Helpers
    function helper-func {
        Write-host "foo"
    }

    #Entry point
    main
}

Invoke-Command -ComputerName mycomputer -Scriptblock $script
Run Code Online (Sandbox Code Playgroud)

使用文件调用Command

或者将其保存到文件中,并以这种方式调用它.

Script.ps1

#Main-function
function main {
    #starting helper function
    helper-func
}

#Helpers
function helper-func {
    Write-host "foo"
}

#Entry point
main
Run Code Online (Sandbox Code Playgroud)

用法:

Invoke-Command -ComputerName mycomputer -FilePath '.\Script.ps1'
Run Code Online (Sandbox Code Playgroud)