Powershell函数调用导致在windows 10上使用Powershell v7时出现函数丢失错误



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

问题

问题是,当我调用Build Solution时,出现了一个缺少函数的错误。

我尝试了什么

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

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

提前感谢!

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

错误消息

Line|
3|生成解决方案$_
|~~~~~~
术语"生成解决方案"未被识别为cmdlet、函数、脚本文件或可操作程序的名称
请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。

构建解决方案代码:

param (
#[Parameter(Mandatory=$true)][string]$plugin_path,
[string]$depth = 5
)
$plugin_path = 'path/to/solutions/'
function Get-Solutions {
Get-ChildItem -File -Path $plugin_path -Include *.sln -Recurse  
}
function Build-Solution($solution) {
dotnet build $solution.fullname
}
function Build-Solutions($solutions) {
$solutions | ForEach-Object -Parallel {
Build-Solution $_
}
}

$solutions_temp = Get-Solutions
Build-Solutions $solutions_temp

来自PowerShell ForEach对象并行功能| PowerShell

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

。。。

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

因此,在这种情况下,最简单的解决方案是在Build-Solutions中定义Build-Solution

至于这个。。。

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

。。。在将代码加载到内存中之前,不能使用这些函数。在函数可用之前,您需要运行代码。

如果您在ISE或VSCode中,如果脚本未保存,请选择全部并点击使用键运行。在ISE中,使用F8 Selected,F5 run all。在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

它将shell输出到PSCore,运行代码,否则,它只从ISE>运行

如果你想将ISE与PSv7一起使用,而不想做shell out的事情,你需要强制ISE使用PSv7来运行代码。参见:

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

最新更新