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);

これらの両方、または1つだけを呼び出すことは可能ですか?明らかに、この特定のケースでは、違いを見分けるのは困難です。

4

3 に答える 3

7

このような複数の引数を受け入れるパスオーバーロードは、.NET4以降でのみ使用できます。Powershellに.NET4を使用して起動するように指示する構成ファイルを作成する必要があります。これにより、これらのメソッドにアクセスできるようになります。

$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"2番目のメソッドを呼び出す必要があると思います。

Path.Combineには2つのオーバーロードされたメソッドがあり、1つは2つの文字列を結合し、もう1つは一連の引数を受け入れるパラメーター配列です。PowerShellの2番目のケースはc#とは異なる方法で処理されます。

これがあなたの質問に答えることを願っています。

参考までに、私はPowerShellの初心者です。

于 2012-09-21T21:55:32.473 に答える