2013-08-16 12 views
6

Próbuję uruchomić cmdlet polecenia invoke przy użyciu C#, ale nie mogę znaleźć właściwej składni. Chcę tylko, aby uruchomić tę prostą komendę:Wywołanie polecenia remote powershell z C#

invoke-command -ComputerName mycomp.mylab.com -ScriptBlock {"get-childitem C:\windows"} 

W kodu C#, mam zrobić, co następuje:

InitialSessionState initial = InitialSessionState.CreateDefault(); 
Runspace runspace = RunspaceFactory.CreateRunspace(initial); 
runspace.Open(); 
PowerShell ps = PowerShell.Create(); 
ps.Runspace = runspace; 
ps.AddCommand("invoke-command"); 
ps.AddParameter("ComputerName", "mycomp.mylab.com"); 
ps.AddParameter("ScriptBlock", "get-childitem C:\\windows"); 
foreach (PSObject obj in ps.Invoke()) 
{ 
    // Do Something 
} 

Kiedy uruchamiam to, otrzymuję wyjątek:

Cannot bind parameter 'ScriptBlock'. Cannot convert the "get-childitem C:\windows" value of type "System.String" to type "System.Management.Automation.ScriptBlock". 

Zgaduję, że muszę użyć gdzieś tutaj typu ScriptBlock, ale nie wiem jak to zrobić. To prosty przykład, aby zacząć, rzeczywisty przypadek użycia wymagałby uruchomienia większego bloku skryptowego z wieloma poleceniami, więc wszelka pomoc w tym zakresie byłaby wysoko ceniona.

Dzięki

Odpowiedz

9

Ah, parametr do ScriptBlock sama musi być typu ScriptBlock.

pełny kod:

InitialSessionState initial = InitialSessionState.CreateDefault(); 
Runspace runspace = RunspaceFactory.CreateRunspace(initial); 
runspace.Open(); 
PowerShell ps = PowerShell.Create(); 
ps.Runspace = runspace; 
ps.AddCommand("invoke-command"); 
ps.AddParameter("ComputerName", "mycomp.mylab.com"); 
ScriptBlock filter = ScriptBlock.Create("Get-childitem C:\\windows"); 
ps.AddParameter("ScriptBlock", filter); 
foreach (PSObject obj in ps.Invoke()) 
{ 
    // Do Something 
} 

Umieszczenie odpowiedź tutaj jeśli ktoś uzna za przydatne w przyszłej ciąg

3

scriptblock należy dopasować format jako „{...}” Użyj kodu naśladowania. będzie ok:

ps.AddParameter("ScriptBlock", "{ get-childitem C:\\windows }"); 
+0

ah miły, ratuje mnie przed popełnieniem jawnego obiektu filtra, dzięki – NullPointer

0

użyć krótkiego formatu:

ps.AddParameter("ScriptBlock", ScriptBlock.Create("Get-childitem C:\\Windows")); 
0

Alternatywne podejście w przypadku, gdy może być bardziej odpowiednie w niektórych przypadkach.

 var remoteComputer = new Uri(String.Format("{0}://{1}:5985/wsman", "HTTP", "ComputerName")); 
     var connection = new WSManConnectionInfo(remoteComputer, null, TopTest.GetCredential()); 

     var runspace = RunspaceFactory.CreateRunspace(connection); 
     runspace.Open(); 

     var powershell = PowerShell.Create(); 
     powershell.Runspace = runspace; 

     powershell.AddScript("$env:ComputerName"); 

     var result = powershell.Invoke(); 

https://blogs.msdn.microsoft.com/schlepticons/2012/03/23/powershell-automation-and-remoting-a-c-love-story/