4

以下是我尝试过的内容和发生的情况的记录。

我正在寻找如何调用特定的重载以及为什么以下不起作用的解释。如果您的回答是“您应该改用此命令行开关”或“调用两次”,请理解我不接受您的回答。

PS C:\> [System.IO.Path]::Combine("C:\", "foo")
C:\foo
PS C:\> [System.IO.Path]::Combine("C:\", "foo", "bar")
Cannot find an overload for "Combine" and the argument count: "3".
At line:1 char:26
+ [System.IO.Path]::Combine <<<< ("C:\", "foo", "bar")
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

PS C:\> [System.IO.Path]::Combine(, "C:\", "foo", "bar")
Missing ')' in method call.
At line:1 char:27
+ [System.IO.Path]::Combine( <<<< , "C:\", "foo", "bar")
    + CategoryInfo          : ParserError: (CloseParenToken:TokenId) [], Paren
   tContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

PS C:\> [System.IO.Path]::Combine($("C:\", "foo", "bar"))
Cannot find an overload for "Combine" and the argument count: "1".
At line:1 char:26
+ [System.IO.Path]::Combine <<<< ($("C:\", "foo", "bar"))
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

这就是我在 c# 中所做的,它有效:

var foobar = Path.Combine(@"C:\", "foo", "bar");
Console.WriteLine(foobar);

什么 Powershell 会调用该特定的重载?Path.Combine 有这两个:

public static string Combine (string path1, string path2, string path3);
public static string Combine (params string[] paths);

可以同时调用这两个,还是只调用一个?显然,在这种特定情况下,很难区分。

4

3 回答 3

7

接受多个类似参数的路径重载仅在 .NET 4 及更高版本中可用。您需要创建一个配置文件来告诉 Powershell 使用 .NET 4 启动,这将使您能够访问这些方法。

在 $pshome 中创建一个名为“powershell.exe.config”的文件,其内容如下:

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
        <supportedRuntime version="v4.0.30319"/> 
        <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration>
于 2012-09-21T22:03:20.917 回答
4

要添加,发出命令:

[System.IO.Path]::Combine.OverloadDefinitions

从你的外壳,你应该得到以下输出:

static string Combine(string path1, string path2)

如您所见,没有可用的重载。

发出命令:

$PSVersionTable

并查看 CLRVersion - 您会看到您使用的是 4.0 之前的 .net 版本,因此 Path.Combine 没有可用的重载。

于 2012-09-21T22:23:58.363 回答
1

在这种情况下,您需要创建一个 params 数组并在其上调用 Combine 方法。params 数组可以创建如下:@("C:\", "foo", "bar")

我相信以下事件作为参数"C:\,foo,bar"应该调用第二种方法。

我不确定你对 Path.Combine 有什么困惑。Combine 有两个重载方法,一个是组合两个字符串,另一个是一个接受一堆参数的参数数组,powershell 中的第二种情况的处理方式与 c# 不同。

希望这能回答你的问题..

仅供参考,我是一个powershell noob ..

于 2012-09-21T21:55:32.473 回答