对于Add-Type导入函数,Powershell中的C#pipe(|)等效?

时间:2017-08-31 18:52:38

标签: c# powershell winapi

我想在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中实现相同的功能,如一般部分所述。

1 个答案:

答案 0 :(得分:2)

要组合(枚举)值,您应该使用+运算符(如果二进制值不重叠)或-bor运算符(布尔值,或者,如果它们重叠。

如果你有来自同一个枚举的常量,你也可以做这样的事情: [FlagsEnumType]" Value1,Value3"

here是指向有关在PowerShell中使用枚举值的帖子的链接。