2013-08-16 3 views
6

Ich versuche, ein invoke-Befehl Cmdlet mit C# auszuführen, aber ich kann nicht die richtige Syntax herausfinden. Ich will nur diesen einfachen Befehl auszuführen:Remote-Powershell-Befehl von C rufen #

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

In C# -Code, ich folgendes getan:

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 
} 

Als ich das laufen, bekomme ich eine Ausnahme:

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

Ich schätze, ich muss hier den ScriptBlock-Typ verwenden, weiß aber nicht, wie. Dies ist nur ein einfaches Beispiel, mit dem Sie beginnen sollten. Der wirkliche Anwendungsfall würde darin bestehen, einen größeren Skriptblock mit mehreren Befehlen auszuführen, so dass jede Hilfe, wie dies getan wird, sehr geschätzt wird.

Dank

Antwort

9

Ah, der Parameter auf Script selbst vom Typ Script sein muss.

vollständiger Code:

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 
} 

Putting hier die Antwort, wenn jemand es in Zukunft

3

Ein Skript Zeichenfolge sollte das Format passen als nützlich findet "{...}" Verwenden Sie den Code folgen. wird in Ordnung sein:

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

ah schön, spart mich ein explizites Filterobjekt aus machen, dank – NullPointer

0

Sie kurzes Format verwenden:

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

Ein alternativer Ansatz für den Fall, dass es in einigen Fällen besser geeignet ist.

 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/

Verwandte Themen