0

我编写了一个脚本来在一个文件夹中构建所有 .net 项目。

问题

问题是当我调用 Build-Sollution 时出现缺少函数错误。

我试过的

我确保在使用它之前声明了该函数,所以我不确定为什么它说它没有定义。

我是 powershell 的新手,但我认为调用另一个函数的函数应该像这样工作?

提前致谢!

请参阅下面的错误消息和代码。

错误信息

线 | 3 | 构建解决方案 $_ | ~~~~~~~~~~~~~~~ 术语“Build-Sollution”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。构建解决方案:

代码

param (
    #[Parameter(Mandatory=$true)][string]$plugin_path,
    [string]$depth = 5
 )

 $plugin_path = 'path/to/sollutions/'

function Get-Sollutions {

  Get-ChildItem -File -Path $plugin_path -Include *.sln -Recurse  

}

function Build-Sollution($solution) {

  dotnet build $solution.fullname

}

function Build-Sollutions($solutions) {

  $solutions | ForEach-Object -Parallel {

    Build-Sollution $_

  }

}


$solutions_temp = Get-Sollutions
Build-Sollutions $solutions_temp

4

2 回答 2

1

至于这个……

我是 powershell 的新手,但我认为调用另一个函数的函数应该像这样工作?

...在将代码加载到内存之前,您无法使用这些功能。您需要在功能可用之前运行代码。

如果您在 ISE 或 VSCode 中,如果脚本未保存,请全选并点击使用键运行。在 ISE 中使用 F8 选中,F5 全部运行。在VSCode中,F8运行选中,crtl+F5全部运行。您也可以单击菜单选项。

如果您从控制台主机执行此操作,请使用点源运行脚本。

. .\UncToYourScript.ps1

新人没关系,我们都是从某个地方开始的,但你首先要提升自己是至关重要的。因此,除了我在这里讨论的内容之外,请务必花时间在 Youtube 上并搜索Beginning、Intermediate、Advanced PowerShell 以供视频使用。网络上有大量免费的培训资源,使用内置的帮助文件也会给你答案。

about_Scripts

脚本范围和点源 每个脚本都在自己的范围内运行。在脚本中创建的函数、变量、别名和驱动器只存在于脚本范围内。您无法在脚本运行的范围内访问这些项目或其值。

要在不同的范围内运行脚本,您可以指定一个范围,例如全局或本地,或者您可以点源脚本。

点源功能允许您在当前范围内而不是在脚本范围内运行脚本。当您运行一个点源脚本时,脚本中的命令就像您在命令提示符下键入它们一样运行。脚本创建的函数、变量、别名和驱动器是在您工作的范围内创建的。脚本运行后,您可以使用创建的项目并在会话中访问它们的值。

要点源脚本,请在脚本路径前键入一个点 (.) 和一个空格。

也可以看看:

'powershell .net 项目构建运行脚本'

'powershell 在一个文件夹中构建所有 .net 项目'

使用 Power Shell 的简单构建脚本

更新

根据您的以下评论:

当然应该使用您选择的任何编辑器保存脚本。

ISE 在设计上并未使用 PSv7,而是使用 WPSv5x 及更早版本。

PSv7 的编辑器是 VSCode。如果您运行包含另一个函数的函数,则您已在该调用中显式加载了所有内容,因此它是可用的。

但是,您是说您使用的是 PSv7,因此,您需要在 PSv7 控制台主机或 VSCode 中运行您的代码,而不是在 ISE 中。

Windows PowerShell(powershell.exe 和 powershell_ise.exe)和 PowerShell Core(pwsh.exe)是两个不同的环境,具有两个不同的可执行文件,旨在在 Windows 上并行运行,但您必须明确选择要使用的环境或编写代码以分支到代码段以相对于您启动的主机执行。

例如,假设我想运行一个控制台命令并且我在 ISE 中,但我需要在 Pwsh 中运行它。我在通过我的 PowerShell 配置文件自动加载的自定义模块中使用了这样的函数:

# Call code by console executable
Function Start-ConsoleCommand
{
    [CmdletBinding(SupportsShouldProcess)]

    [Alias('scc')]

    Param  
    ( 
        [string]$ConsoleCommand,
        [switch]$PoSHCore
    )

    If ($PoSHCore)
    {Start-Process pwsh -ArgumentList "-NoExit","-Command  &{ $ConsoleCommand }" -PassThru -Wait}
    Else {Start-Process powershell -ArgumentList "-NoExit","-Command  &{ $ConsoleCommand }" -PassThru -Wait}
}

所有这些代码正在做的就是接受我发送的任何命令,如果我使用 PoSHCore 开关......

scc -ConsoleCommand 'SomeCommand' -PoSHCore

...它将向 PSCore 输出,运行代码,否则,它只是从 ISE 运行>

如果您想将 ISE 与 PSv7 一起使用并且不做外壳操作,您需要强制 ISE 使用 PSv7 运行代码。看:

在 Windows PowerShell ISE 中使用 PowerShell Core 6 和 7

于 2020-05-13T18:18:44.560 回答
1

来自PowerShell ForEach-Object 并行功能 | 电源外壳

脚本块在称为 PowerShell 运行空间的上下文中运行。运行空间上下文包含所有定义的变量、函数和加载的模块。

...

并且每个运行空间必须加载所需的任何模块,并从调用脚本显式传入任何变量。

所以在这种情况下,最简单的解决方案是在Build-Sollution里面定义Build-Sollutions

于 2020-05-13T18:54:33.223 回答