2009-03-06 2 views
7

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


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

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

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

Select-Object의 매개 변수로 전달되는 연관 배열이 올바르게 구문 분석되지 않습니다. 다른 쪽에서 오는 것입니다 :


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

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

Select-Object 명령 매개 변수를 설정하는 방법에있어 잘못된 점은 무엇입니까?

답변

13

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 경험에서 가장 강력한 부분입니다.

-Oisin

+0

유형도 'Mananagement'에 "오류 CS0117 : 'System.Management.Automation.ScriptBlock이'만들기 '에 대한 정의가 포함되어 있지 않습니다"- 그 이외의 아 큰 – xcud

+0

를 작동 v1 powershell을 사용해야합니다 (create static은 v2에 있음). 죄송합니다! – x0n

+0

그게 내가 생각한거야. 해결책은 수락되었습니다. 나는 당신이 제공 한 것을 적용하여 내가 필요로하는 것을 얻고 그것을 실제 앱에 적용했다. 훌륭하게 작동합니다. 최고의 적. – xcud