【发布时间】:2014-10-19 01:24:25
【问题描述】:
需要将此 PowerShell 脚本集成到我的 C# 汇编代码中。不知道该怎么做。如果需要任何其他信息,请随时询问。提前致谢。
PowerShell 脚本:
#Script that does the linking and renaming:
# Creates a variable called IncidentID and points Incident # to it for use within the script
Param(
[string]$IncidentID
)
# Load the SMlets module
Import-Module SMlets
# Get the Incident Class
$IncClass = Get-SCSMClass -Name System.WorkItem.Incident$
# Get the RMA Class
$RMAClass = Get-SCSMClass -Name COMPANY.RMA.Class
# Build the Filter String
$FilterStr = "ID -eq " + $IncidentID
# Find the Incident we need to link to an RMA
$Inc = Get-SCSMObject -Class $IncClass -Filter $FilterStr
$RMAIncText = "[Linked to Incident " + $Inc.ID + "]"
$RMADescription = $RMAIncText
New-SCSMObject -Class $RMAClass -PropertyHashtable (@{Title = $Inc.Title; Description = $RMADescription})
# Find the new RMA to be linked
$FilterStr = "Description -eq '$RMADescription'"
$RMA = Get-SCSMObject -Class $RMAClass -Filter $FilterStr
#Set RMA Number Variable
$RMANumber = $RMA.RMA_ID;
#Clean up DisplayName, Title and Description
$RMA | Set-SCSMObject -PropertyHashtable @{"DisplayName" = $RMANumber; "Title" = $RMANumber; "Description" = $RMANumber;}
## Create an Incident Related Items instance referencing the new RMA
$RWIClass = Get-SCSMRelationshipClass -Name System.WorkItemRelatesToWorkItem$
New-SCSMRelationshipObject -Relationship $RWIClass -Source $Inc -Target $RMA -Bulk
# Unload the SMlets module
Remove-Module SMlets
汇编代码:
public class RMATask : ConsoleCommand
{
public RMATask()
{
}
public override void ExecuteCommand(IList<NavigationModelNodeBase> nodes, NavigationModelNodeTask task, ICollection<string> parameters)
{
IManagementGroupSession session = (IManagementGroupSession)FrameworkServices.GetService<IManagementGroupSession>();
EnterpriseManagementGroup emg = session.ManagementGroup;
ManagementPack mp = emg.ManagementPacks.GetManagementPack(new Guid("a82d62c5-ece0-35fd-a266-9afa246dea78"));
ManagementPackClass mpc = emg.EntityTypes.GetClass(new Guid("4b081ab1-f48e-9c62-77bc-76bc31349030"));
ManagementPackObjectTemplate mpt = emg.Templates.GetObjectTemplate(new Guid("92ed7c4d-aff5-819e-90f8-c92064c50cd6"));
NavigationModelNodeBase nodeIn = nodes[0];
NavigationModelNodeBase nmnbNew;
NavigationModelNodeTask nmntNew = NavigationTasksHelper.CreateNewInstanceLink(mpc, mpt);
Microsoft.EnterpriseManagement.GenericForm.GenericCommon.MonitorCreatedForm(nodeIn, nmntNew, out nmnbNew);
}
}
对于那些对这里的细节感兴趣的人,他们是: 问题 基本上,我们有生成事件的帮助台分析师。有时,他们可能需要生成 RMA(退货授权,如果您不知道这意味着什么,只需知道这是他们需要填写的另一种表格),并且 RMA 需要与事件相关联.事件不需要具有 RMA,但每个 RMA 都需要附加到其相应的父事件。
为此,我创建了一个名为 COMPANY.RMA.Class 的新类,在 Visual Studio 中从头开始创建了一个新表单,并将 MP(管理包)XML 和表单程序集 (.dll) 打包到一个 MPB(管理包捆)。 我将此上传到控制台,并创建了一个名为“创建 RMA”的新控制台任务,该任务在选择事件模块时变得可见。
此任务将启动我的 PowerShell 脚本,该脚本反过来将获取所选或打开的事件的 ID,创建一个 RMA 对象,并将创建的 RMA 对象与事件的 ID # 相关联(允许稍后看到它在事件的“相关项目”选项卡中)。 但是,我在这里遇到了问题。我正确地创建了链接功能,但我无法让 RMA 表单在创建后自动打开。相反,当任务运行时,它会创建对象并保存它,但分析师必须关闭事件并重新打开它以刷新新数据,导航到“相关项目”选项卡,然后选择新创建的 RMA 以打开并填写表格。这是很多额外的工作,应该被消除。 正确的功能应该是创建 RMA 表单,将其与打开/选定的事件相关联,然后启动刚刚创建的 RMA 表单以允许分析师填写其详细信息。
显然没有直接从控制台任务调用/启动表单的功能。看来我必须直接修改汇编代码才能访问 SCSM SDK(我需要工作的层)。这就是我迷路的地方——我不知道如何将我的 PowerShell 脚本转换为 C# 汇编代码。任何帮助将不胜感激。
【问题讨论】:
-
你的powershell脚本和c#代码是做什么的? 整合它们是什么意思?你想尝试格式化你的问题吗?
-
如果您正在寻找 run powershell from inside your c# app,有一个 few sites 可以帮助您。
-
@admdrew 我之前在这个论坛上问过一个不同的问题,并且因为我的问题太具体和有太多文字而被骂。我试图缩短它,现在我有同样的反应-_-
-
@SirLearnAlot,这绝对是一种平衡。技能是能够提供足够的信息来引导我们解决问题,而无需粘贴代码墙。继续发布问题并磨练该技能。你会到达那里。 :)
标签: c# powershell scripting visual-studio-2013