请考虑以下PowerShell代码片段:
$csharpString = @"
using System;
public sealed class MyClass
{
public MyClass() { }
public override string ToString() {
return "This is my class. There are many others " +
"like it, but this one is mine.";
}
}
"@
Add-Type -TypeDefinition $csharpString;
$myObject = New-Object MyClass
Write-Host $myObject.ToString();如果我在同一个AppDomain中多次运行该脚本(例如,在powershell.exe或powershell_ise.exe中运行该脚本两次),我会得到以下错误:
Add-Type : Cannot add type. The type name 'MyClass' already exists.
At line:13 char:1
+ Add-Type -TypeDefinition $csharpString;
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (MyClass:String) [Add-Type],
Exception
+ FullyQualifiedErrorId :
TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand如何包装对Add-Type -TypeDefinition的调用,使其只被调用一次?
发布于 2014-03-04 04:34:50
这个技巧对我来说很有效:
if (-not ([System.Management.Automation.PSTypeName]'MyClass').Type)
{
Add-Type -TypeDefinition 'public class MyClass { }'
}DateTime类型名可以用引号引起来,也可以用方括号'Assembly').
在内部,PSTypeName类调用处理繁重任务的LanguagePrimitives.ConvertStringToType()方法。它在成功时缓存查找字符串,因此额外的查找速度更快。
我还没有确认x0n和Justin D提到的内部是否抛出了任何异常。
发布于 2014-03-04 07:42:56
实际上,这些都不是必需的。Add-Type维护一个缓存,其中包含您提交给它的任何代码以及结果类型。如果您使用相同的代码调用Add-Type两次,那么它将不会费心编译代码,只会返回上次的类型。
您可以通过在一行中运行两次Add-Type调用来验证这一点。
在上面的示例中出现错误消息的原因是,您在调用Add-Type之间更改了代码。虽然上面的解决方案在这种情况下消除了这个错误,但它也意味着您正在使用一个较旧的类型定义,该类型可能没有按照您所认为的方式运行。
发布于 2013-05-15 05:02:05
执行此操作的最简单方法是try/catch块。执行此操作有两种选择:
try { [MyClass] | Out-Null } catch { Add-Type -TypeDefinition $csharpString; }try { Add-Type -TypeDefinition $csharpString; } catch {}https://stackoverflow.com/questions/16552801
复制相似问题