我想在PowerShell中调用C#函数,但是包含管道的参数。我可以在C#SomeCSharpFunction( THING | OTHERTHING, ARG2, ARG3)
中以这种方式调用它,但是在使用Add-Type
在PowerShell中导入函数后,我无法找到相同的方法。
如果我有像这样的“单个”参数
,导入的函数会按预期工作[Imported.Functions]::SomeCSharpFunction($Arg1,$Arg2,$Arg3) #This works
但是我无法将$Arg1
设置为$Thing | $OtherThing
,因为PowerShell会以不同方式解释管道,也无法调用功能
[Imported.Functions]::SomeCSharpFunction( $Thing | $OtherThing, $Arg2, $Arg3) #This doesn't
我在PowerShell中尝试了一些其他分隔符,试图以某种方式逃避| character(`|,\ |,'|',none没有诀窍),尝试发送PowerShell数组@($Thing,OtherThing)
)
我的在线搜索没有成功,因为搜索引擎似乎忽略了|字符。
我目前使用的解决方法是定义一个接受多个参数的C#Wrapper函数,然后使用这些参数“merged”调用SomeCSharpFunction
。 ,但是如果有任何
在我的PowerShell脚本中,我使用Add-Type从Kernel32“导入”一个函数,就像这样
$Signature = @"
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
"@
$Kernel32 = Add-Type -MemberDefinition $Signature -Name "Process" -Namespace Win32Functions -PassThru
然后我可以使用$Kernel32::OpenProcess($DesiredAccess,$InheritHandle, $ProcessId)
在PowerShell中调用它,如果我的参数是“唯一的”,它将完美地运行。
现在,在C#中我可以这样调用它(注意我已经将PROCESS_VM_OPERATION和PROCESS_VM_READ设置为它们各自的uint值)
OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, vProcessId)
我试图在PowerShell中实现相同的功能,如一般部分所述。
答案 0 :(得分:2)
要组合(枚举)值,您应该使用+运算符(如果二进制值不重叠)或-bor运算符(布尔值,或者,如果它们重叠。
如果你有来自同一个枚举的常量,你也可以做这样的事情: [FlagsEnumType]" Value1,Value3"
here是指向有关在PowerShell中使用枚举值的帖子的链接。