Powershell 在MVCSCaffolder中将参数传递给方法

Powershell 在MVCSCaffolder中将参数传递给方法,powershell,asp.net-mvc-scaffolding,Powershell,Asp.net Mvc Scaffolding,我正在将值传递给T4Scaffolding.Scaffolder的前两个参数。但这并不符合我的期望 这是powershell脚本文件。让我们给它命名为Test.ps1 [T4Scaffolding.Scaffolder(Description = "Enter a description of Service here")][CmdletBinding()] param( [string]$ClassName, [string]$Project, [str

我正在将值传递给T4Scaffolding.Scaffolder的前两个参数。但这并不符合我的期望

这是powershell脚本文件。让我们给它命名为
Test.ps1

[T4Scaffolding.Scaffolder(Description = "Enter a description of Service here")][CmdletBinding()]
param(        
    [string]$ClassName,
    [string]$Project,
    [string]$CodeLanguage,
    [string[]]$TemplateFolders,
    [switch]$Force = $false
)

Write-Host "Class name is " $ClassName
Write-host "Project name is" $Project
然后我在PackageManager控制台上运行它,如下所示

PM> Scaffold Test Member ConsoleApplication1.Domain
它正确地打印了我的类名称,但项目名称是在nuget package manager控制台上选择的名称,而不是我给出的名称

Class name is  Member
Project name is ConsoleApplication1.Scaffolder
但例外的结果是

Class name is  Member
Project name is ConsoleApplication1.Domain
现在的问题是如何将ClassName和Project作为参数传递?它只接受ClassName作为参数,但忽略第二个参数。

已编辑

我也试过这个,但也没用

Scaffold Service -ClassName Member -Project ConsoleApplication1.Domain

在删除名为Scaffold.ps1的T4scaffold属性后,从powershell控制台调用脚本,如下所示:

.\Scaffold Test Member ConsoleApplication1.Domain
会回来的

Class name is  Test
Project name is Member
这是意料之中的。我不知道你为什么说你得到了不同的结果,但即使是你预期的结果也不是预期的

这样称呼:

Scaffold Service -ClassName Member -Project ConsoleApplication1.Domain
是否给出了您预期的结果

Class name is  Member
Project name is ConsoleApplication1.Domain
$CodeLanguage将提供此服务


因此,可能是NuGet package manager控制台执行了一些不同的操作

默认的$Project参数与您在PMC中已声明的项目相同

要将代码构建到另一个项目中(或添加新项目),您可以这样做

[T4Scaffolding.Scaffolder(Description = "Description here...")][CmdletBinding()]
param([parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)][string]$ProjectName = "",     
[string]$Project,
[string]$CodeLanguage,
[string[]]$TemplateFolders,
[switch]$Force = $false)
请注意,“ProjectName”将按属性名从管道中检索。。。因此,下面是一个例子

Scaffold Service -projectname SomeProjectName
将$ProjectName的值设置为“SomeProjectName”

在这之后,你可以用这个名字做任何你喜欢的事。。。如果项目已经存在,则将代码添加到项目中;如果项目尚未在解决方案中,则自行添加项目

例如:

#
#Add new project if it does not exist
#
if(($DTE.Solution.Projects | Select-Object -ExpandProperty Name) -notcontains $ProjectName){
Write-Host "Adding new project"
$sln = [System.IO.Path]::GetFilename($dte.DTE.Solution.FullName)
$path = $dte.DTE.Solution.FullName.Replace($sln,'').Replace('\\','\')
$sln = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
$templatePath = $sln.GetProjectTemplate("ClassLibrary.zip","CSharp")
$sln.AddFromTemplate($templatePath, $path+$ProjectName,$ProjectName)
$file = Get-ProjectItem "Class1.cs" -Project $ProjectName
$file.Remove()

有趣。scaffolder方法的最后4个参数来自默认值($ProjectName、$CodeLanguage、$TemplateFolders和$Force)。当我将一个新参数添加为$ProjectName时,它的工作方式与我预期的一样。但是默认的$Project参数始终是在PackageManager控制台上为我选择的参数。