문제

C#에서 PowerShell로 연관 배열을 전달하고 싶습니다. 예를 들어이 PowerShell 코드 라인을 실행하고 싶습니다.


PS C:\> get-command | select name, @{N="Foo";E={"Bar"}} -first 3

Name                                                        Foo
----                                                        ---
Add-Content                                                 Bar
Add-History                                                 Bar
Add-Member                                                  Bar

파이프 라인을 통해이 작업을 수행하고 싶습니다 별개의 스크립트로 표시된 단일 명령과 반대되는 명령. 코드는 다음과 같습니다.


Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();

pipeline.Commands.Add("get-command");

Command c = new Command("select-object");
List properties = new List();
properties.Add("name");
properties.Add("@{N=\"Foo\";E={\"Bar\"}}");
c.Parameters.Add("Property", properties.ToArray());
c.Parameters.Add("First", 3);
pipeline.Commands.Add(c);

pipeline.Commands.Add("Out-String");

Collection retval = pipeline.Invoke();
runspace.Close();

StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in retval)
    Console.WriteLine(obj.ToString());

그러나 Select-Object의 매개 변수로 전달되는 연관 배열은 올바르게 구문 분석되지 않습니다. 이것이 반대편으로 나오는 것입니다.


PS C:\test> c:\test\Bin\Debug\test.exe

Name                                     @{N="Foo";E={"Bar"}}
----                                     --------------------
Add-Content
Add-History
Add-Member

Select-Object 명령 매개 변수를 설정하는 방법에 어떤 문제가 있습니까?

도움이 되었습니까?

해결책

C#을 통해 파이프 라인을 만들고 기본 PowerShell 스크립트로 파이프 라인을 만드는 것은 실제로 매개 변수 바인더라는 하나의 주요 차이점이 있습니다.

순수한 스크립트로 코드 버전을 작성하면 동일한 오류가 발생합니다. 해시 가능한 리터럴은 문자열 값으로 취급됩니다.

ps> $ps = $ps.Commands.Add("get-process")
ps> $ps = $ps.Commands.Add("select-object")
ps> $ps.Commands[1].Parameters.Add("Property", @("Name", '@{N="Foo";E={"Bar"}}'))

이 경우, 명령은 "이름"과 해시 가능한 문자열 인 두 줄의 배열을 수신합니다. 이것은 C#과 정확히 같은 방식으로 깨질 것입니다. 이제 올바른 방법을 살펴보십시오 (스크립트) - 3 행을 다시 작성하겠습니다.

ps> $ps.Commands[1].Parameters.Add("Property", @("Name", @{N="Foo";E={"Bar"}}))

그래서 무엇이 바뀌 었습니까? 나는 해시 테이블 주위의 따옴표를 제거했다 - 나는 객체 배열의 두 번째 요소로 해시 테이블을 전달하고있다! 따라서 C# 예제를 작동 시키려면 명령 줄에서 매개 변수 바인더가 우리를 위해 수행하는 일을 수행해야합니다 (많은 것입니다!). 바꾸다:

properties.Add("@{N=\"Foo\";E={\"Bar\"}}");

~와 함께

properties.Add(
    new Hashtable {
        {"N", "Foo"},
        {"E", System.Mananagement.Automation.ScriptBlock.Create("\"Foo\"")}
    }
);

나는 이것이 당신을 위해 그것을 정리하기를 바랍니다. 파라미터 바인더는 아마도 가장 눈에 띄지 만 PowerShell 경험에서 가장 강력한 부분 일 것입니다.

-이신

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top