2012-09-21 2 views
4

다음은 내가 시도한 것과 무슨 일이 일어 났는지에 대한 성적표입니다.Powershell의 .net 프레임 워크에서 오버로드 된 정적 메서드를 어떻게 호출합니까?

다음 오버레이가 작동하지 않는 이유에 대한 설명과 함께 특정 오버로드를 호출하는 방법을 찾고 있습니다. 대답이 "이 커맨드 릿을 대신 사용해야합니다"또는 "두 번 부름"이라면 대답을 수락하지 않을 때 이해하십시오. 작동

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

? Path.Combine은 다음 두 가지를 모두 가지고 있습니다 :

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

둘 다 호출 할 수 있습니까, 아니면 하나만 호출 할 수 있습니까? 분명히이 특별한 경우에는 그 차이를 말하기 어렵습니다.

+3

이러한 오버로드는 .Net 4.0에서 새로 추가되었습니다. Powershell이 ​​.Net 4.0에서 실행되고 있습니까? '[environment] :: version'을 사용하면 CLR 버전을 얻을 수 있습니다. – Lee

답변

7

경로 오버로드 PowerShell은 멍청한 놈입니다. Powershell이 ​​.NET 4를 사용하여 실행하도록 설정 파일을 만들어야합니다.이 파일을 사용하면 해당 방법에 액세스 할 수 있습니다. 당신이해야, 쉘에서

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

: 명령을 실행,

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0.30319"/> 
     <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 
+2

또는 이미 .NET 4.0에서 실행되는 powershell 3.0을 설치하여 사용할 수 있습니다. – x0n

1

당신은 다음과 같이에 있습니다 .. PARAMS 배열을 생성 할 수 있습니다를 결합 방법을이 경우에 PARAMS 배열을 생성하고 호출 할 필요가 다음 매개 변수로 다음 @("C:\", "foo", "bar")

내가 이벤트를 생각 "C:\,foo,bar" 두 번째를 호출해야합니다 방법.

Path.Combine이 두 개의 문자열을 결합하는 두 개의 오버로드 된 메서드를 갖고 있고 다른 하나는 인수 묶음을 허용하는 다른 매개 변수 배열을 가지고 있습니다. powershell의 두 번째 사례는 C#과 다르게 처리됩니다. 이 질문에 응답

희망 ..

는 참고로, 나는 .. 그런 .NET 4 위로에서만 사용할 수있는 여러 인수를 사용할

4

추가 :

다음 내용을 $ PSHome이라는에서 "powershell.exe.config"라는 파일을 생성 다음 출력을 얻으십시오 :

static string Combine(string path1, string path2) 

위에서 볼 수 있듯이 과부하는 없습니다.

문제 명령 :

$PSVersionTable 

과 CLRVERSION보고 - 당신은 4.0 전에 .NET 버전을 사용하는, 그래서 가능 Path.Combine에 대한 오버로드가없는 볼 수 있습니다.

관련 문제