gpt4 book ai didi

powershell - 如果尚未添加类,如何有条件地使用 Add-Type -TypeDefinition 添加类?

转载 作者:行者123 更新时间:2023-12-03 06:46:22 28 4
gpt4 key购买 nike

考虑以下 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 使其只被调用一次?

最佳答案

这个技术对我来说很有效:

if (-not ([System.Management.Automation.PSTypeName]'MyClass').Type)
{
Add-Type -TypeDefinition 'public class MyClass { }'
}
  • 类型名称可以用引号“MyClass”、方括号 [MyClass] 或两者“[MyClass]”括起来(仅限 v3+)。
  • 类型名称查找不区分大小写。
  • 您必须使用类型的全名,除非它是系统命名空间的一部分(例如,[System.DateTime] 可以通过 'DateTime' 查找,但 [System.Reflection.Assembly] 不能通过“组装”)。
  • 我只在Win8.1中测试过这个; PowerShell v2、v3、v4。

在内部,PSTypeName 类调用 LanguagePrimitives.ConvertStringToType() 方法来处理繁重的工作。成功时它会缓存查找字符串,因此额外的查找速度更快。

我还没有确认是否像 x0n 和 Justin D 提到的那样在内部抛出任何异常。

关于powershell - 如果尚未添加类,如何有条件地使用 Add-Type -TypeDefinition 添加类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16552801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com