【发布时间】:2015-11-23 09:21:03
【问题描述】:
我正在尝试使用可用的 PowerShell 命令 (https://psbiztalk.codeplex.com) 自动执行 BizTalk 部署。当我从 PowerShell ISE UI 运行我的脚本时,一切正常。但我想拥有自己的部署 UI,这就是我的问题所在。该脚本的行为不同,并且在某一时刻找不到任何导致错误的资源(当前):
在中键入“Microsoft.BizTalk.ApplicationDeployment.ResourceCollection” 程序集'Microsoft.BizTalk.ApplicationDeployment.Engine, 版本=3.0.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 是 未标记为可序列化。
Get-ApplicationResourceSpec 的输出将是一个System.Xml.XmlDocument 对象。似乎该命令无法从托管的 PowerShell 东西中找到 BizTalk 应用程序资源,但 ISE 环境可以,所以我认为它应该以某种方式成为可能。
感谢任何想法和/或帮助。
PowerShell 脚本:
$SnapIn = Get-PSSnapin | Where-Object { $_.Name -eq "BizTalkFactory.PowerShell.Extensions" }
if ($SnapIn -eq $null)
{
Add-PSSnapin -Name "BizTalkFactory.Powershell.Extensions"
}
Set-Location -Path BizTalk:
cd "BizTalk:\Applications"
Get-ApplicationResourceSpec -Path "MyTestApplication"
从 C# 应用程序调用
string script = File.ReadAllText("GetResources.ps1")));
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
StringBuilder builder = new StringBuilder();
Collection<PSObject> objects = pipeline.Invoke();
foreach (PSObject obj in objects.Where(t => t != null))
{
builder.AppendLine(obj.ToString());
}
runspace.Close();
更新
由于 BizTalk PowerShell 命令是开源的,我深入挖掘并尝试隔离失败的命令。我发现以下代码给出了不同的结果:
# Replace Get-ApplicationResourceSpec -Path "MyTestApplication" from the
# other script with these lines
$App = Get-ChildItem | Where-Object { $_.Name -eq $Application } | Select-Object -First 1
$Group = New-Object Microsoft.BizTalk.ApplicationDeployment.Group
$Group.DBName = $App.Catalog.Database
$Group.DBServer = $App.Catalog.Instance
$Group.SqlConnection.ConnectionString
在 ISE 环境中,ConnectionString 设置为有效值,但在 C# 情况下则不然。这会导致第二种情况下的资源不存在:
$App = $Group.Applications["MyTestApplication"]
$App.ResourceCollection.Count # equals 88 vs. 0
因此,BizTalk 内部类型Microsoft.BizTalk.ApplicationDeployment.Group 的行为方式似乎不同。关于这个发现还有什么想法吗?
【问题讨论】:
标签: c# powershell biztalk powershell-ise