从powershell调用c#方法而不提供可选参数

本文关键字:参数 powershell 调用 方法 | 更新日期: 2023-09-27 18:11:07

我有一个c#方法,我从dll加载可选的字符串参数,默认为null。例如

public void foo(string path, string new_name = null, bool save_now = true)
{
    if(name == null)
        new_name = Path.GetFileNameWithoutExtension(path);
    ...
    if(save_now)
       Save();
}

我想从powershell脚本中调用它,而不是为new_name提供一个值,而是为save_now提供一个值。根据这个看似非常相似的问题,我试过

$default = [type]::Missing
$obj.foo($path, $default, $false)

,但这会导致new_name在函数中被设置为"System.Reflection.Missing"

另外我试过

$obj.foo($path, $null, $false)

,但这导致new_name被设置为空字符串,仍然不是null。我可以将默认值设置为空字符串,但我想知道是否有任何好的方法来实际使用默认值。

从powershell调用c#方法而不提供可选参数

在PowerShell中不能这样做。它不支持c#/VB的可选参数。当程序员不提供默认值时,调用方法的语言有责任提供默认值,而PowerShell就是不这样做。

您可以简单地省略调用中的可选参数。我修改了您的示例,以便在PS中运行。例如:

$c = @"
    public static class Bar {
        public static void foo(string path, string new_name = null, bool save_now = true)
        {
            System.Console.WriteLine(path);
            System.Console.WriteLine(new_name);
            System.Console.WriteLine(save_now);
        }
    }
"@
add-type -TypeDefinition $c
[Bar]::Foo("test",[System.Management.Automation.Language.NullString]::Value,$false)

生成以下

test
False

Test显式通过,null为null,没有输出,save_now求值为默认值True。