Powershell 在MVCSCaffolder中将参数传递给方法
我正在将值传递给T4Scaffolding.Scaffolder的前两个参数。但这并不符合我的期望 这是powershell脚本文件。让我们给它命名为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
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控制台上为我选择的参数。